Ich bin sehr neu und versuche gerade Elm zu lernen. Ich komme von JS / React und hatte noch keine RFP Erfahrung.
Ich bin in dem Guide genau hier: Ссылка
Der Teil, mit dem ich Probleme habe, ist update
und view
:
Beginnen wir mit der Msg-Deklaration. Der Guide sagt:
Es braucht ein Argument, in diesem Fall die Change-Funktion, die war erstellt, als wir den Nachrichtentyp deklarierten:
Änderung: String - & gt; Msg
Ich sehe nicht, wie das hier passiert ist:
%Vor% Wie haben wir hier eine Change-Funktion definiert? Wie haben wir definiert, wie diese Funktion funktioniert? Für mich sieht es so aus, als hätten wir gerade den Typ von Msg deklariert, der irgendwie enthält, was auch immer Change
ist und den Typ String
.
Meine zweite Frage betrifft das Update:
%Vor% Für mich sieht das so aus, als wäre update eine Funktion höherer Ordnung, die ein Msg
übernimmt und eine Funktion Model -> Model
zurückgibt. Dann definieren wir eine Funktion mit zwei Parametern. Bedeutet Msg -> Model -> Model
nur, dass alle außer dem letzten Teil Parameter sind?
Dann rufen wir die Funktion Change
auf:
Was ich nicht verstehe, ist der Pfeil. Normalerweise kommt der Pfeil nach einer Paramdefinition. Aber hier haben wir das Ergebnis einer Funktion vor dem ->
.
Ich hoffe meine Fragen ergeben Sinn, ich bin nur sehr verwirrt mit dieser (vermutlich tollen) Sprache.
Wenn Sie type Msg = Change String
deklarieren, deklarieren Sie einen einzelnen Typ ( Msg
) mit einem Konstruktor, der einen String akzeptiert.
Siehe Elm Guide-Abschnitt zu Union-Typen (AKA Algebraische Datentypen, ADTs).
Hier ist ein Beispiel:
%Vor%Beim Erstellen des Typs
User
wurden also die KonstruktorenAnonymous
undNamed
erstellt. Wenn SieUser
erstellen möchten, müssen Sie einen dieser beiden Konstruktoren verwenden
Konstruktoren sind Funktionen, daher nennt man sie Change "a string"
(gibt den Typ Msg
zurück)
Konstruktoren bieten auch die Möglichkeit, Mustervergleich zu verwenden, um den inneren Wert in einem Union-Typ zu extrahieren. Dies ist die Verwendung von ->
, mit der Sie nicht vertraut waren.
Ihre zweite Frage;
Für mich sieht das so aus, als wäre update eine Funktion höherer Ordnung, die eine Msg übernimmt und eine Funktion Model - & gt; Modell
Ja, das ist mehr oder weniger was passiert. Die Vorrangregeln für die Funktionsanwendung bedeuten, dass Sie sie ohne Klammern aufrufen können. Dies wird currying genannt, und es wird auch im Ulmenleitfaden behandelt
Nur um ein bisschen mehr den zweiten Teil zu verdeutlichen:
Alle Funktionen sind curried, dh update: Msg->Model->Model
kann eine Msg
erhalten und eine Funktion Model->Model
zurückgeben oder eine Msg
und eine Model
erhalten und eine Model
zurückgeben.
Wenn Sie in Wirklichkeit update aMessage aModel
aufrufen, rufen Sie wirklich update aMessage
auf, das eine Funktion zurückgibt und dann übergeben Sie aModel
an diese Funktion, die die Ausdrücke im Rumpf der Funktion ausführt und das aktualisierte Modell zurückgibt.
Der Pfeil ist nur ein Teil der case.. of
-Syntax. Die linke Seite ist das Muster, das Sie zuordnen möchten, die rechte Seite ist der Ausdruck, den Sie ausführen möchten. In Ihrem Fall führt Ihr Update den Ausdruck nur dann aus, wenn die Nachricht mit dem Konstruktor Change erstellt wurde.
Im vorherigen Fall kann Msg entweder mit Change String
oder mit Delete
erstellt werden. Die Aktualisierungsfunktion verhält sich je nach Aufbau der Nachricht anders.