2016-10-04 3 views
4

Wenn ich versuche, Elm mit einem Hintergrund in JS und wenig Erfahrung in stark und statisch typisierten Sprachen zu lernen, stelle ich fest, dass die Hauptschwierigkeit sich um die Typssyntax dreht (und welche Typen nützlich sind) . Leider finde ich die Dokumente in dieser Hinsicht nicht sehr hilfreich.Verstehen von Typen in Elm

Wenn ich das einfache Beispiel hier: http://elm-lang.org/examples/buttons, die Zeile:

type Msg = Increment | Decrement 

definiert eine Vereinigung Typen Msg als "Seine" entweder Increment oder Decrement. Es scheint zu vermuten, dass Increment und Decrement auch Typen sind. Was genau sind sie? (Sie sind an keiner anderen Stelle im Beispiel definiert und auch nicht vordefiniert).

Dann werden sie in der view Funktion als ein Argument von onClick verwendet. Jetzt scheinen sie wie eine Art "Botschaft" zu handeln (was auch immer das bedeutet). In JS würde dies wahrscheinlich dadurch erreicht werden, dass jeder (mutierbaren) Variablen ein Wert zugewiesen wird - was natürlich nicht der Elm-Weg sein kann. Also, arbeiten die Typen mit dem Thema der Unveränderbarkeit?

Die view Funktion:

view model = 
    div [] 
    [ button [ onClick Decrement ] [ text "-" ] 
    , div [] [ text (toString model) ] 
    , button [ onClick Increment ] [ text "+" ] 
    ] 

ich das denke, möglicherweise öffnet sich ein breiteres Thema (wenn jemand nützliche Links verweisen kann, Dank!), Aber meine Frage ist: Was sind Increment und Decrement hier? Wie passen sie in Elms Typsystem?

+1

Der Elm Guide hat eine ausführlichere Diskussion über [Union Typen hier] (https://guide.elm-lang.org/types/union_types.html). –

+0

Ich merke auch, dass der definierte Union-Typ 'Msg' an anderer Stelle im Beispiel nicht verwendet wird. Muss es auf diese Weise definiert werden, so dass wir die 'case' Anweisung in der' update' Funktion verwenden dürfen? –

+1

Sie können 'Msg' nirgendwo anders sehen, da die anderen Funktionen in diesem Beispiel nicht kommentiert sind (in Elm müssen sie nicht _have_ sein, aber es kann sehr hilfreich sein, Ihre Funktionen mit Anmerkungen zu versehen). Unter der Annahme, dass 'Model' ein Typalias von' Int' ist, sollten die Typanmerkungen wie folgt lauten: 'view: model -> Html Msg' und' update: Msg -> Model -> Model' –

Antwort

3

Increment und Decrement sind Datenkonstrukteure. Sie können sich diese als OO Konstruktoren vorstellen, sie können Parameter haben und, was noch wichtiger ist, man kann sie unterscheiden.

Sie haben Recht, dass sie tatsächlich eine Nachricht sind; Da sie jedoch keine Parameter haben, unterscheiden sie sich nicht von Aufzählungswerten. Die Tatsache, dass ein Wert unveränderlich ist, hat damit wenig zu tun. C/C++/Java unterstützt auch Aufzählungen.

In diesem speziellen Fall können Sie sogar an Msg als Phantasie Namen für eine boolean denken.

Sum-Typen sind eigentlich meistens wie Union-Typen in C. Der Unterschied ist, dass in Elm speichert, welche der Optionen es ist. Elm nimmt diese Konzepte von Haskell.

+0

Ich habe vor kurzem angefangen, Haskell zu lernen und ich war tatsächlich motiviert, Elm zu stolpern, als mir klar wurde, woher Elms Syntax kommt. Ich glaube, dass Gewerkschaften in Haskell algebraische Datentypen genannt werden? Wie auch immer, ich schweife ab - gute Antwort! –