Haskell Language
Roll
Sök…
Introduktion
Med TypeFamilies
kan programmeraren definiera TypeFamilies
. Det som skiljer typfunktioner från icke-GADT-konstruktörer är att parametrar för typfunktioner kan vara icke-parametriska medan parametrar för typkonstruktörer alltid är parametriska. Denna åtskillnad är viktig för riktigheten av tillägget GeneralizedNewTypeDeriving
. För att undersöka denna distinktion introduceras roller i Haskell.
Anmärkningar
Se även SafeNewtypeDeriving
.
Nominell roll
Haskell Wiki har ett exempel på en icke-parametrisk parameter för en typfunktion:
type family Inspect x
type instance Inspect Age = Int
type instance Inspect Int = Bool
Här är x
icke-parametrisk eftersom Inspect
måste inspektera x
för att bestämma resultatet av att tillämpa Inspect
på ett Inspect
.
I detta fall är x
rollen nominell. Vi kan förklara rollen uttryckligen med RoleAnnotations
förlängningen:
type role Inspect nominal
Representativ roll
Ett exempel på en parametrisk parameter för en typfunktion:
data List a = Nil | Cons a (List a)
type family DoNotInspect x
type instance DoNotInspect x = List x
Här är x
parametrisk för att bestämma resultatet av att tillämpa DoNotInspect
på ett DoNotInspect
inte inspektera x
.
I detta fall är x: s roll representativ. Vi kan förklara rollen uttryckligen med RoleAnnotations
förlängningen:
type role DoNotInspect representational
Fantomroll
En fantomtypsparameter har en fantomroll. Fantomroller kan inte förklaras uttryckligen.