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.



Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow