Ho una lista, e ora voglio l'ennesimo articolo. In Haskell userei !!
, ma non riesco a trovare una variante olmo di quello.Come ottengo una voce di elenco per indice in elm?
risposta
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)
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!
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
Giusto per aggiungere un'altra alternativa (ultimo (prendere lista degli indici) -.> Funziona solo se indice non è 0 o 1, ma si ottiene l'idea –
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
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