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.



Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow