Haskell Language
Rolle
Suche…
Einführung
Mit der TypeFamilies
kann der Programmierer Funktionen auf TypeFamilies
definieren. Typfunktionen unterscheiden sich nicht von GADT-Typkonstruktoren: Parameter von Typfunktionen können nicht parametrisch sein, während Parameter von Typkonstruktoren immer parametrisch sind. Diese Unterscheidung ist wichtig für die Richtigkeit der Erweiterung GeneralizedNewTypeDeriving
. Um diese Unterscheidung zu erläutern, werden Rollen in Haskell eingeführt.
Bemerkungen
Siehe auch SafeNewtypeDeriving
.
Nominale Rolle
Haskell Wiki hat ein Beispiel für einen nicht parametrischen Parameter einer Typfunktion:
type family Inspect x
type instance Inspect Age = Int
type instance Inspect Int = Bool
Hier ist x
nicht parametrisch, da zur Bestimmung des Ergebnisses der Anwendung von Inspect
auf ein Inspect
die Inspect
x
untersuchen muss.
In diesem Fall ist die Rolle von x
nominell. Wir können die Rolle explizit mit der Erweiterung RoleAnnotations
:
type role Inspect nominal
Repräsentative Rolle
Ein Beispiel eines parametrischen Parameters einer Typfunktion:
data List a = Nil | Cons a (List a)
type family DoNotInspect x
type instance DoNotInspect x = List x
Hier ist x
parametrisch, da zur Ermittlung des Ergebnisses der Anwendung von DoNotInspect
auf ein DoNotInspect
die DoNotInspect
x
nicht untersuchen muss.
In diesem Fall ist die Rolle von x repräsentativ. Wir können die Rolle explizit mit der Erweiterung RoleAnnotations
:
type role DoNotInspect representational
Phantomrolle
Ein Phantomtyp-Parameter hat eine Phantomrolle. Phantomrollen können nicht explizit deklariert werden.