Szukaj…


Krotki

Krotki są uporządkowanymi listami wartości dowolnego typu.

(True, "Hello!", 42)

Nie można zmienić struktury krotki ani zaktualizować wartości.

Krotki w Elm są uważane za prymitywny typ danych, co oznacza, że nie trzeba importować żadnych modułów, aby używać Krotek.

Dostęp do wartości

Moduł Podstawowy ma dwie funkcje pomocnicze do uzyskiwania dostępu do wartości krotki o długości dwóch ( a, b ) bez użycia dopasowania wzorca:

fst (True, "Hello!") -- True
snd (True, "Hello!") -- "Hello!"

Dostęp do krotek o większej długości odbywa się poprzez dopasowanie wzorca.

Dopasowywanie wzorów

Krotki są niezwykle przydatne w połączeniu z dopasowaniem wzoru:

toggleFlag: (Sting, Bool) -> (Sting, Bool)
toggleFlag (name, flag) =
    (name, not flag)

Uwagi na temat krotek

Krotki zawierają mniej niż 7 wartości comparable typu danych

Słowniki

Słowniki są zaimplementowane w podstawowej bibliotece Dict .

Słownik mapujący unikalne klucze na wartości. Klucze mogą być dowolnego porównywalnego typu. Obejmuje to Int, Float, Time, Char, String i krotki lub listy porównywalnych typów.

Wstawianie, usuwanie i wykonywanie zapytań zajmuje cały czas O (log n).

W przeciwieństwie do Tuple i Records, słowniki mogą zmieniać swoją strukturę, innymi słowy można dodawać i usuwać klucze.

Możliwe jest zaktualizowanie wartości za pomocą klucza.

Możliwe jest również uzyskanie dostępu lub aktualizacja wartości za pomocą klawiszy dynamicznych.

Dostęp do wartości

Możesz pobrać wartość ze słownika za pomocą funkcji Dict.get .

Definicja typu Dict.get :

get : comparable -> Dict comparable v -> Maybe v

Zawsze będzie zwracać Maybe v , ponieważ możliwe jest uzyskanie wartości przez nieistniejący klucz.

import Dict

initialUsers =
      Dict.fromList [ (1, "John"), (2, "Brad") ]

getUserName id =
  initialUsers
  |> Dict.get id
  |> Maybe.withDefault "Anonymous"
  
getUserName 2 -- "Brad"
getUserName 0 -- "Anonymous"

Aktualizacja wartości

Operacja aktualizacji słownika jest wykonywana przy użyciu funkcji Maybe.map , ponieważ żądany klucz może być nieobecny.

import Dict

initialUsers =
  Dict.fromList [ (1, "John"), (2, "Brad") ]

updatedUsers =
  Dict.update 1 (Maybe.map (\name -> name ++ " Johnson")) initialUsers

Maybe.withDefault "No user" (Dict.get 1 updatedUsers) -- "John Johnson"

Dokumentacja

Rekord to zestaw par klucz-wartość.

greeter =
    { isMorning: True
    , greeting: "Good morning!"
    }

Nie można uzyskać dostępu do wartości przez nieistniejący klucz.

Nie można dynamicznie modyfikować struktury Record.

Rekordy pozwalają tylko aktualizować wartości za pomocą stałych kluczy.

Dostęp do wartości

Nie można uzyskać dostępu do wartości za pomocą klucza dynamicznego, aby zapobiec możliwym błędom w czasie wykonywania:

isMorningKeyName =
    "isMorning "


greeter[isMorningKeyName] -- Compiler error
greeter.isMorning -- True

Alternatywna składnia dostępu do wartości umożliwia wyodrębnienie wartości podczas przesuwania rekordu:

greeter
    |> .greeting
    |> (++) " Have a nice day!" -- "Good morning! Have a nice day!"

Rozszerzanie typów

Czasami chcesz, aby podpis parametru ograniczał typy rekordów przekazywane do funkcji. Poszerzenie typów rekordów sprawia, że nie jest konieczne stosowanie nadtypów. Poniższy przykład pokazuje, jak można wdrożyć tę koncepcję:

type alias Person =
    { name : String
    }


type alias Animal =
    { name : String
    }


peter : Person
peter =
    { name = "Peter" }


dog : Animal
dog =
    { name = "Dog" }


getName : { a | name : String } -> String
getName livingThing =
    livingThing.name


bothNames : String
bothNames =
    getName peter ++ " " ++ getName dog

Możemy nawet pójść o krok dalej i rozszerzyć rekordy i zrobić coś takiego:

type alias Named a = { a | name : String }
type alias Totalled a = { a | total : Int }


totallyNamed : Named ( Totalled { age : Int })
totallyNamed =
  { name = "Peter Pan"
  , total = 1337
  , age = 14
  }

Mamy teraz sposoby na przekazywanie tych typów częściowych w funkcjach:

changeName : Named a -> String -> Named a
changeName a newName =
  { a | name = newName }
  
cptHook = changeName totallyNamed "Cpt. Hook" |> Debug.log "who?"

Aktualizacja wartości

Wiąz ma specjalną składnię do aktualizacji rekordów:

model =
    { id: 1
    , score: 0
    , name: "John Doe"
    }


update model =
    { model
       | score = model.score + 100
       | name = "John Johnson"
    }


Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow