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.



Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow