Haskell Language
Rol
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.