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.



Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow