Zoeken…


Invoering

Met de TypeFamilies kan de programmeur functies op type niveau definiëren. Wat typefuncties onderscheidt van niet-GADT-type constructors is dat parameters van typefuncties niet-parametrisch kunnen zijn, terwijl parameters van type constructors altijd parametrisch zijn. Dit onderscheid is belangrijk voor de juistheid van de extensie GeneralizedNewTypeDeriving . Om dit onderscheid te verduidelijken, worden rollen in Haskell geïntroduceerd.

Opmerkingen

Zie ook SafeNewtypeDeriving .

Nominale rol

Haskell Wiki heeft een voorbeeld van een niet-parametrische parameter van een typefunctie:

type family Inspect x
type instance Inspect Age = Int    
type instance Inspect Int = Bool

Hier is x niet-parametrisch, omdat de typefunctie x moet inspecteren om de uitkomst te bepalen van het toepassen van Inspect op een type argument.

In dit geval is de rol van x nominaal. We kunnen de rol expliciet verklaren met de extensie RoleAnnotations :

type role Inspect nominal

Representatieve rol

Een voorbeeld van een parametrische parameter van een typefunctie:

data List a = Nil | Cons a (List a)

type family DoNotInspect x
type instance DoNotInspect x = List x

Hier is x parametrisch omdat om de uitkomst van het toepassen van DoNotInspect op een DoNotInspect te bepalen, de DoNotInspect x niet hoeft te inspecteren.

In dit geval is de rol van x representatief. We kunnen de rol expliciet verklaren met de extensie RoleAnnotations :

type role DoNotInspect representational

Fantoomrol

Een parameter van het spooktype heeft een spookrol. Fantoomrollen kunnen niet expliciet worden verklaard.



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