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?
Der Elm Guide hat eine ausführlichere Diskussion über [Union Typen hier] (https://guide.elm-lang.org/types/union_types.html). –
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? –
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' –