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.



Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow