Haskell Language
Generaliserade algebraiska datatyper
Sök…
Grundläggande användning
När GADTs tillägget är aktiverat kan du, förutom vanliga datadeklarationer, också deklara generaliserade algebraiska datatyper enligt följande:
data DataType a where
Constr1 :: Int -> a -> Foo a -> DataType a
Constr2 :: Show a => a -> DataType a
Constr3 :: DataType Int
En GADT-deklaration visar de typer av alla konstruktörer som en datatyp har uttryckligen. Till skillnad från vanliga datatypdeklarationer kan typen av en konstruktör vara vilken som helst N-ary-funktion (inklusive nullary) -funktion som slutligen resulterar i datatypen som tillämpas på vissa argument.
I det här fallet har vi förklarat att typen DataType har tre konstruktörer: Constr1 , Constr2 och Constr3 .
Constr1 konstruktören skiljer sig inte från en deklarerad med en vanlig data DataType a = Constr1 Int a (Foo a) | ... : data DataType a = Constr1 Int a (Foo a) | ...
Constr2 kräver emellertid att a har en instans av Show , och så när konstruktorn används skulle instansen behöva existera. Å andra sidan, när mönstermatchning på det, kommer det faktum att a är en instans av Show i omfattning, så du kan skriva:
foo :: DataType a -> String
foo val = case val of
Constr2 x -> show x
...
Observera att Show a begränsning inte visas i funktionstypen och endast syns i koden till höger om -> .
Constr3 har typen DataType Int , vilket innebär att när ett värde av typen DataType a är en Constr3 , är det känt att a ~ Int . Denna information kan också återvinnas med en mönstermatchning.