Haskell Language
Rôle
Recherche…
Introduction
L'extension de langage TypeFamilies
permet au programmeur de définir des fonctions au niveau du type. Ce qui distingue les fonctions de type des constructeurs de type non-GADT, c'est que les paramètres des fonctions de type peuvent être non paramétriques alors que les paramètres des constructeurs de types sont toujours paramétriques. Cette distinction est importante pour l'exactitude de l'extension GeneralizedNewTypeDeriving
. Pour expliquer cette distinction, les rôles sont introduits dans Haskell.
Remarques
Voir aussi SafeNewtypeDeriving
.
Rôle nominal
Haskell Wiki a un exemple de paramètre non paramétrique d'une fonction de type:
type family Inspect x
type instance Inspect Age = Int
type instance Inspect Int = Bool
Ici, x
est non paramétrique car pour déterminer le résultat de l'application d' Inspect
à un argument de type, la fonction de type doit inspecter x
.
Dans ce cas, le rôle de x
est nominal. Nous pouvons déclarer le rôle explicitement avec l'extension RoleAnnotations
:
type role Inspect nominal
Rôle de représentation
Un exemple de paramètre paramétrique d'une fonction de type:
data List a = Nil | Cons a (List a)
type family DoNotInspect x
type instance DoNotInspect x = List x
Ici, x
est paramétrique car, pour déterminer le résultat de l'application de DoNotInspect
à un argument de type, la fonction de type n'a pas besoin d'inspecter x
.
Dans ce cas, le rôle de x est figuratif. Nous pouvons déclarer le rôle explicitement avec l'extension RoleAnnotations
:
type role DoNotInspect representational
Rôle fantôme
Un paramètre de type fantôme a un rôle fantôme. Les rôles fantômes ne peuvent pas être déclarés explicitement.