Haskell Language
Gegeneraliseerde algebraïsche gegevenstypen
Zoeken…
Basisgebruik
Wanneer de GADTs
extensie is ingeschakeld, kunt u naast reguliere gegevensverklaringen ook algemene gegenereerde datatypes als volgt declareren:
data DataType a where
Constr1 :: Int -> a -> Foo a -> DataType a
Constr2 :: Show a => a -> DataType a
Constr3 :: DataType Int
Een GADT-verklaring geeft expliciet de typen van alle constructors weer die een gegevenstype heeft. In tegenstelling tot reguliere datatype-declaraties, kan het type constructor elke N-ary (inclusief nullary) functie zijn die uiteindelijk resulteert in het datatype dat op sommige argumenten wordt toegepast.
In dit geval hebben we verklaard dat het type DataType
drie constructors heeft: Constr1
, Constr2
en Constr3
.
De Constr1
constructor verschilt niet van een die is gedeclareerd met behulp van een reguliere gegevensdeclaratie: data DataType a = Constr1 Int a (Foo a) | ...
Constr2
vereist echter dat a
een instantie van Show
, en dus wanneer de constructor wordt gebruikt, moet de instantie bestaan. Aan de andere kant, wanneer het patroon overeenkomt, komt het feit dat a
een exemplaar van Show
is in scope, dus je kunt schrijven:
foo :: DataType a -> String
foo val = case val of
Constr2 x -> show x
...
Merk op dat de optie Show a
beperking weergeven niet wordt weergegeven in het type van de functie en alleen zichtbaar is in de code rechts van ->
.
Constr3
heeft het type DataType Int
, wat betekent dat wanneer een waarde van het type DataType a
een Constr3
, het bekend is dat a ~ Int
. Ook deze informatie kan worden hersteld met een patroonovereenkomst.