2014-04-21 17 views

Odpowiedz

12

Nie ma odpowiednika tego w Wiązu. Można oczywiście wdrożyć to samodzielnie.

(Uwaga: nie jest to funkcja "całkowita", więc tworzy wyjątek, gdy indeks znajduje się poza zakresem).

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

Lepszym sposobem byłoby zdefiniowanie funkcji całkowitej za pomocą typu danych Może.

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

Wystarczy dodać inną alternatywę (ostatni (wziąć listy indeksu.) -> działa tylko wtedy, gdy indeks nie jest równe 0 lub 1, ale masz pomysł –

+0

Haskell podnosi Spośród wyjątkiem zakresu podczas korzystania (!!) poza zasięgiem.Myślę, że byłoby to użyteczne Być może, ale wydaje się dziwne, aby poprosić o element z listy i uzyskać coś typu, który nie jest typem elementów na liście (w tym przypadku jest to być może zamiast) – TheSeamau5

+6

W nowszych wersjach Wiązu możesz zdefiniować 'get n xs = List.head (List.drop n xs)' i jest to funkcja total. "Powyższa składnia' | 'została usunięta w 0.16. – mgold

26

Elm dodano tablice w 0.12.1.

import Array 

myArray = Array.fromList [1..5] 

myItem = Array.get 2 myArray 

Tablice są indeksowane od zera. Indeksy negatywne nie są obecnie obsługiwane (w moim przypadku).

Należy pamiętać, że myItem : Maybe Int. Elm robi wszystko, co możliwe, aby uniknąć błędów w czasie wykonywania, tak więc dostęp poza granice zwraca wyraźną Nothing.

Jeśli szukasz indeksu do listy, zamiast wziąć głowę i ogon, powinieneś rozważyć użycie tablicy.

Array documentationUwaga: Tablica rdzeń realizacja jest uszkodzony; zamiast tego użyj this one!

+0

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

+0

Czy ostatni wiersz nadal jest prawdziwy w świetle https://github.com/elm-lang/ core/issues/649? – KillerX

+0

Stała implementacja macierzy została scalona, ​​ale nie została wydana. – mgold

0

Użyłem tego:

(!!): 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 

Oczywiście dostaniesz Może i trzeba rozpakować go podczas korzystania z tej funkcji. Nie ma gwarancji, że twoja lista nie będzie pusta lub że poprosisz o indeks niemożliwy do wykonania (np. 1000) - dlatego właśnie kompilator wiązów zmusza cię do uwzględnienia tego przypadku.

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 
Powiązane problemy