2014-04-21 7 views

Antwort

12

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) 
+0

Nur eine weitere Alternative hinzufügen (letzte (Indexliste nehmen.) -> funktioniert nur, wenn Index nicht 0 oder 1 ist, aber Sie bekommen die Idee –

+0

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

+6

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

26

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!

+0

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

+0

Stimmt die letzte Zeile noch unter https://github.com/elm-lang/? Kern/Ausgaben/649? – KillerX

+0

Die Implementierung des festen Arrays wurde zusammengeführt, aber nicht freigegeben. – mgold

0

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