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.