Ich habe eine Liste, und jetzt möchte ich den n-ten Artikel. In Haskell würde ich !!
verwenden, aber ich kann eine Ulmenvariante davon nicht finden.Wie bekomme ich einen Listeneintrag per Index in Ulme?
Antwort
Es gibt kein Äquivalent davon in Elm. Sie könnten es natürlich selbst implementieren.
(Hinweis: Dies ist keine "total" -Funktion, daher wird eine Ausnahme erstellt, wenn der Index außerhalb des Bereichs liegt).
Ein besserer Weg wäre die Definition einer Gesamtfunktion mit dem Datentyp Maybe.
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 hinzugefügt Arrays in 0.12.1.
import Array
myArray = Array.fromList [1..5]
myItem = Array.get 2 myArray
Arrays sind nullindiziert. Negative Indizes werden derzeit nicht unterstützt (bummer, ich weiß).
Beachten Sie, dass myItem : Maybe Int
. Elm tut alles, um Laufzeitfehler zu vermeiden, so dass der Zugriff außerhalb der Grenzen eine explizite Nothing
zurückgibt.
Wenn Sie sich eher in einer Liste als in der Kopfzeile befinden, sollten Sie ein Array verwenden.
Array documentationWichtig: Die Kernarray Umsetzung gebrochen ist; Verwenden Sie stattdessen this one!
Ich habe benutzten:
(!!): 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
Natürlich erhalten Sie ein Vielleicht, und Sie müssen es auszupacken, wenn Sie diese Funktion verwenden. Es gibt keine Garantie, dass Ihre Liste nicht leer ist oder dass Sie nach einem unmöglichen Index (wie 1000) fragen - deshalb zwingt Ihnen der elm Compiler Sie, diesen Fall zu berücksichtigen.
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
Nur eine weitere Alternative hinzufügen (letzte (Indexliste nehmen.) -> funktioniert nur, wenn Index nicht 0 oder 1 ist, aber Sie bekommen die Idee –
Haskell wirft eine außerhalb des zulässigen Bereichs Ausnahme, wenn Sie verwenden (!!) Ich denke, es wäre sinnvoll, Maybe zu verwenden, aber es scheint seltsam, ein Element aus einer Liste anzufordern und etwas von einem Typ zu bekommen, der nicht dem Typ der Elemente in der Liste entspricht (in diesem Fall erhält man May statt a) – TheSeamau5
In neueren Versionen von Elm können Sie 'get n xs = List.head (List.drop n xs)' definieren und es ist eine totale Funktion, done. Die obige '|' Syntax wurde in 0.16 entfernt. – mgold