Elm "type" Syntax - Woher kommt der Wert?

8

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 :

%Vor%

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:

%Vor%

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.

    
MoeSattler 20.05.2016, 18:11
quelle

2 Antworten

4

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 Konstruktoren Anonymous und Named erstellt. Wenn Sie User 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.

%Vor%

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

    
Daenyth 20.05.2016, 18:15
quelle
2

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.

%Vor%

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.

    
afcastano 20.05.2016 22:44
quelle

Tags und Links