2017-02-26 2 views
2

Ich habe die folgende Typdeklaration:Warum benötigt der folgende Typkonstruktor weniger Argumente als der Datenkonstruktor?

data Quadruple a b = Quad a a b b 

(Einige von Ihnen könnten diese Erklärung von erkennen Yet Another Haskell Tutorial).

Ich verstehe die Absicht des Codes zu sein: erstellen Sie einen Datentyp namens Quadruple. Es hat einen einzelnen Typkonstruktor namens Quad, der vier Werte annimmt. Die ersten beiden Werte müssen denselben Typ haben, und die letzten beiden Werte müssen denselben Typ haben.

Ich habe Probleme, mir zu erklären, warum der Typkonstruktor weniger Argumente als der Datenkonstruktor benötigt. Die einzige Erklärung, die ich heraufbeschwören konnte, ist, dass Haskell aus der Typdeklaration schließen kann, dass, wenn der erste Wert vom Typ a ist, auch der zweite Wert, und wenn der dritte Wert vom Typ b ist, auch der vierte Wert ist.

Ist das korrekt? Fehle ich hier etwas? Ich weiß, dass Haskell Typ-Inferenz hat, also macht das Sinn, aber ich möchte nicht mit dem falschen mentalen Modell laufen. (Das zweite Mal versucht Haskell zu lernen).

Antwort

8

Es könnte mit der Verwendung des Typs

q = Quad 1 2 "peter" "paul" 

Hier klarer sein können Sie sehen, gibt es zwei Arten im Spiel, Int und String. So ist q vom Typ Quadruple Int String.

Also gibt es 2 Arten im Spiel: die Anzahl der Typparameter Quadruple. Und es gibt 4 Werte (/ Felder), die für den Wertkonstruktor benötigt werden: die Anzahl der Argumente des Quad Wertkonstruktors.

5

Es ist wie mit Funktionen, wo jeder formale Parameter mehr als einmal verwendet werden kann, wie sqr x = x * x.

Hier gilt das gleiche: Quadruple ist ein Typ Konstruktor: es eine neue Art konstruiert, wenn zwei Typen Argument gegeben, a und b. So ist Quadruple Int Double ein Typ; Quadruple Int Int ist ein anderer Typ.

Wie werden Werte erstellt? Mit einem Daten Konstruktor Quad mit vier Argument Werte: ein Paar mit einem Typ und ein anderes Paar mit einem anderen Typ. Dies ist, was Sie Haskell mit dieser Definition erzählen. Also, ja, es wird dieses Wissen verwenden, um die Typen abzuleiten und zu prüfen.

1

Ich denke, Sie haben Recht - die linke Seite erklärt nur die Typ-Variablen, die auf der rechten Seite verwendet werden können .

So alle folgenden gelten:

data A = A Int 

keine Variable auf der LHS => keine auf der RHS

data B b = B1 Int | B2 b 

hat eine Variable auf LS und verwendet diese in einem der es ist Konstrukteure auf der RHS; Beachten Sie, dass Sie die Variable überhaupt nicht verwenden müssen - dies wird Phantom-Typ genannt.

data C c = C Int 

was immer noch etwas Nützliches ist.

: mit Ausnahme von existenziellen Typen

Verwandte Themen