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.