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.