Haskell Language
Verallgemeinerte algebraische Datentypen
Suche…
Grundlegende Verwendung
Wenn die Erweiterung GADTs aktiviert ist, können Sie neben regulären Datendeklarationen auch generalisierte algebraische Datentypen wie folgt deklarieren:
data DataType a where
Constr1 :: Int -> a -> Foo a -> DataType a
Constr2 :: Show a => a -> DataType a
Constr3 :: DataType Int
Eine GADT-Deklaration listet explizit die Typen aller Konstruktoren eines Datentyps auf. Im Gegensatz zu regulären Datentypdeklarationen kann der Typ eines Konstruktors eine beliebige N-ary-Funktion (einschließlich null) sein, die letztendlich dazu führt, dass der Datentyp auf einige Argumente angewendet wird.
In diesem Fall haben wir erklärt, dass der Typ DataType drei Konstruktoren hat: Constr1 , Constr2 und Constr3 .
Der Constr1 Konstruktor unterscheidet sich nicht von einem, der mit einer regulären Datendeklaration deklariert wurde: data DataType a = Constr1 Int a (Foo a) | ...
Constr2 erfordert jedoch, dass a über eine Instanz von Show verfügt. Wenn Sie also den Konstruktor verwenden, muss die Instanz vorhanden sein. Auf der anderen Seite kommt die Tatsache, dass a eine Instanz von Show ist, beim Anpassen von Mustern darauf in den Gültigkeitsbereich, sodass Sie Folgendes schreiben können:
foo :: DataType a -> String
foo val = case val of
Constr2 x -> show x
...
Beachten Sie, dass die Funktion zum Show a Einschränkung nicht im Typ der Funktion angezeigt wird und nur im Code rechts von -> sichtbar ist.
Constr3 hat den Typ DataType Int , Constr3 wenn ein Wert vom Typ DataType a ein Constr3 , ist bekannt, dass a ~ Int . Auch diese Informationen können mit einer Musterübereinstimmung wiederhergestellt werden.