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.