Könnte jemand den Unterschied erklären zwischen:
- Algebraische Datentypen (mit denen ich ziemlich vertraut bin)
- Generalisierte algebraische Datentypen (was macht sie generalisiert?)
- Induktive Typen (zB Coq)
(Besonders induktive Typen.) Danke.
Könnte jemand den Unterschied erklären zwischen:
(Besonders induktive Typen.) Danke.
Mit algebraischen Datentypen können Sie Typen rekursiv definieren. Nehmen wir konkret an, wir haben den Datentyp
Was dies bedeutet , ist , dass die kleinste Menge der erzeugten N i l und C o n s Operatoren. Wir können dies formalisieren, indem wir den Operator F ( X ) definieren.
und dann definieren als
Eine verallgemeinerte ADT erhalten wir, wenn wir einen Typoperator rekursiv definieren. Beispielsweise könnten wir den folgenden Typkonstruktor definieren:
Dieser Typ bedeutet, dass ein Element von istfür mancheein Tupel von a s der Länge 2 n , da jedes Malwir in die gehen N e s t Konstruktor der Typ Argument mit sich selbst gepaart. So können wir den Operator definieren, den wir als festen Punkt verwenden möchten:
Ein induktiver Typ in Coq ist im Wesentlichen ein GADT, bei dem die Indizes des Typoperators nicht auf andere Typen beschränkt sind (wie beispielsweise in Haskell), sondern auch durch Werte der Typentheorie indiziert werden können . Auf diese Weise können Sie Typen für längenindexierte Listen usw. angeben.
bush
GADTs gesehen. Ich habe sie als verschachtelte oder nicht reguläre Typen bezeichnet gesehen.bush a
? In diesem Beispiel ist esNest Leaf(a) Leaf(a) Leaf(a) Leaf(a)
oderNest ((Nest Leaf(a) Leaf(a)) (Nest Leaf(a) Leaf(a)))
als ein Beispiel der Menge?Betrachten Sie algebraische Datentypen wie:
Die Rückgabetypen jedes Konstruktors in einem Datentyp sind alle gleich:
Nil
undCons
beide geben zurückList a
. Wenn wir den Konstruktoren erlauben, verschiedene Typen zurückzugeben, haben wir eine GADT :Occupied
hat den Typa -> NullableList a b -> NullableList a NonEmpty
, währendCons
der Typ hata -> List a -> List a
. Es ist wichtig zu beachten, dass diesNonEmpty
ein Typ ist, kein Begriff. Ein anderes Beispiel:Induktive Typen in Programmiersprachen mit abhängigen Typen ermöglichen es den Rückgabetypen der Konstruktoren, von den Werten (nicht nur den Typen) der Argumente abzuhängen.
Eine Randnotiz: GHC hat einen Mechanismus zur Behandlung von Wertekonstruktoren als Typkonstruktoren . Dies ist nicht dasselbe wie die abhängigen induktiven Typen, die Coq hat, aber es verringert die syntaktische Belastung von GADTs etwas und kann zu besseren Fehlermeldungen führen.
quelle