2014-04-21 10 views

risposta

12

Non esiste un equivalente in Elm. Ovviamente potresti implementarlo tu stesso.

(Nota: questa non è una funzione "totale", pertanto crea un'eccezione quando l'indice non è compreso nell'intervallo).

infixl 9 !! 
(!!) : [a] -> Int -> a 
xs !! n = head (drop n xs) 

Un modo migliore sarebbe quello di definire una funzione totale, utilizzando il tipo di dati Forse.

infixl 9 !! 
(!!) : [a] -> Int -> Maybe a 
xs !! n = 
    if | n < 0  -> Nothing 
    | otherwise -> case (xs,n) of 
     ([],_) -> Nothing 
     (x::xs,0) -> Just x 
     (_::xs,n) -> xs !! (n-1) 
+0

Giusto per aggiungere un'altra alternativa (ultimo (prendere lista degli indici) -.> Funziona solo se indice non è 0 o 1, ma si ottiene l'idea –

+0

Haskell solleva un'eccezione di gamma quando si utilizza (!!) Immagino che avrebbe senso usare Forse, ma sembra strano richiedere un elemento da una lista e ottenere qualcosa di un tipo che non è il tipo di elementi nella lista (in questo caso ottenere Forse un invece di un) – TheSeamau5

+6

Nelle versioni più recenti di Elm, è possibile definire 'get n xs = List.head (List.drop n xs)' ed è una funzione totale, fatta. La sintassi '|' di cui sopra è stata rimossa in 0.16. – mgold

26

Elm ha aggiunto gli array in 0.12.1.

import Array 

myArray = Array.fromList [1..5] 

myItem = Array.get 2 myArray 

Gli array sono a zero indice. Gli indici negativi non sono attualmente supportati (bummer, lo so).

Si noti che myItem : Maybe Int. Elm fa tutto il possibile per evitare errori di runtime, quindi l'accesso fuori dai limiti restituisce un esplicito Nothing.

Se ti stai cercando di indicizzare in un elenco piuttosto che prendere la testa e la coda, dovresti considerare l'utilizzo di un array.

Array documentationImportante: L'array nucleo attuazione è rotto; utilizzare invece this one!

+0

'negativeGet array indice = array get (index + length array) – hoosierEE

+0

L'ultima riga rimane valida alla luce di https://github.com/elm-lang/ core/issues/649? – KillerX

+0

L'implementazione dell'array fisso è stata unita ma non rilasciata. – mgold

0

Ho usato questo:

(!!): Int -> List a -> Maybe a 

(!!) index list =       -- 3 [ 1, 2, 3, 4, 5, 6 ] 

    if (List.length list) >= index then 

     List.take index list    -- [ 1, 2, 3 ] 
     |> List.reverse     -- [ 3, 2, 1 ] 
     |> List.head      -- Just 3 
    else 
     Nothing 

Naturalmente si ottiene un forse ed è necessario scartarlo quando si utilizza questa funzione. Non è garantito che la tua lista non sia vuota, o che tu chieda un indice non permissibile (come 1000) - ecco perché il compilatore di elm ti costringe a rendere conto di quel caso.

main = 
let 
    fifthElement = 
    case 5 !! [1,2,3,4,255,6] of // not sure how would you use it in Haskell?! But look's nice as infix function. (inspired by @Daniël Heres) 
     Just a -> 
     a 
     Nothing -> 
     -1 
in 
    div [] 
     [ text <| toString fifthElement ]   // 255