2016-05-20 13 views
8

Jestem bardzo nowy i obecnie próbuję uczyć się Wiązu. Pochodzę z JS/React i nie miałem żadnego doświadczenia z RFP.Składnia "typu" wiązu - skąd pochodzi wartość?

Jestem w przewodniku prawo tutaj: http://guide.elm-lang.org/architecture/user_input/text_fields.html

Część mam problemy z jest update i view:

-- UPDATE 

type Msg 
    = Change String 

update : Msg -> Model -> Model 
update msg model = 
    case msg of 
    Change newContent -> 
     { model | content = newContent } 


-- VIEW 

view : Model -> Html Msg 
view model = 
    div [] 
    [ input [ placeholder "Text to reverse", onInput Change ] [] 
    , div [] [ text (String.reverse model.content) ] 
    ] 

Zacznijmy deklaracji Msg. Przewodnik mówi:

ona jeden argument, w tym przypadku Zmiana funkcji, która była tworzony podczas zadeklarowaliśmy typ o błędzie:

Zmiana: String -> Msg

I don Zobacz, jak to się stało:

type Msg 
    = Change String 

Jak zdefiniowaliśmy tutaj funkcję zmiany? Jak zdefiniowaliśmy działanie tej funkcji? Dla mnie wygląda na to, że właśnie zadeklarowaliśmy typ Msg, który w jakiś sposób zawiera to, co jest Change i typ String.

Moje drugie pytanie dotyczy aktualizacji:

update : Msg -> Model -> Model 
update msg model = 
    case msg of 
    Change newContent -> 
     { model | content = newContent } 

Dla mnie to wygląda aktualizacja jest funkcja wyższego rzędu, która zajmuje Msg i zwraca funkcję Model -> Model. Ale wtedy definiujemy funkcję z dwoma parametrami. Czy Msg -> Model -> Model oznacza po prostu, że wszystkie oprócz ostatniej części są parametrami?

Wtedy nazywamy Change funkcję:

Change newContent -> 
      { model | content = newContent } 

Co mi się nie dostać się tam jest strzałka. Zwykle strzałka przychodzi po definicji paramu. Ale tutaj mamy wynik funkcji przed ->.

Mam nadzieję, że moje pytania mają sens, po prostu jestem bardzo zdezorientowany tym (prawdopodobnie niesamowitym) językiem.

Odpowiedz

4

Kiedy deklarujesz type Msg = Change String, deklarujesz pojedynczy typ (Msg) z jednym Konstruktorem, który akceptuje Łańcuch.

Zobacz sekcję przewodnika Wiąz o Union Types (AKA Algebraic Data Types, ADTs).

Oto próbka:

type User = Anonymous | Named String 

Więc tworząc rodzaj User również utworzone konstruktorów nazwane Anonymous i Named.Jeśli chcesz stworzyć User należy użyć jednego z tych dwóch konstruktorów

Konstruktorzy są funkcje, więc nazywamy je jak Change "a string" (zwroty typu Msg)

Konstruktorzy również zapewnić możliwość korzystania Pattern Matching, aby wyodrębnić wartość wewnętrzną w typie związku. To jest użycie ->, z którym nie byłeś zaznajomiony.

case msg of 
    Change theString -> ... use theString ... 

Twoje drugie pytanie;

Dla mnie to wygląda aktualizacja jest funkcja wyższego rzędu, która zajmuje błędzie i zwraca funkcję Model -> model

Tak, to jest mniej więcej to, co się dzieje. Reguły pierwszeństwa dla zastosowania funkcji oznaczają, że możesz wywoływać je bez nawiasów. To się nazywa currying, i to również objęte w przewodniku wiąz

2

Wystarczy, aby wyjaśnić nieco więcej na drugą część:

Wszystkie funkcje są curry, co oznacza, że ​​update: Msg->Model->Model można otrzymać Msg i powrotu funkcji Model->Model lub odbierać Msg i Model i zwracać Model.

W rzeczywistości, kiedy zadzwonić update aMessage aModel jesteś naprawdę nazywając update aMessage która zwraca funkcję, a następnie przejechania aModel do tej funkcji, która będzie działać wyrażenia w ciele funkcji i powrócić zaktualizowany model.

Strzałka jest tylko częścią składni case.. of. Lewa strona to wzór, który chcesz dopasować, a prawa strona to wyrażenie, które chcesz wykonać. W twoim przypadku twoja aktualizacja wykona wyrażenie tylko wtedy, gdy Msg został utworzony przy użyciu konstruktora Change.

type Msg 
    = Change String | Delete 

update : Msg -> Model -> Model 
update msg model = 
    case msg of 
    Change newContent -> 
     { model | content = newContent } 
    Delete -> 
     { model | content = "" } 

w poprzednim przypadku, MSG może być wykonana zarówno z Change String lub Delete. Funkcja aktualizacji zachowuje się inaczej w zależności od sposobu, w jaki skonstruowano msg.

Powiązane problemy