Haskell Language
Papel
Buscar..
Introducción
La extensión de lenguaje TypeFamilies
permite al programador definir funciones de nivel de tipo. Lo que distingue a las funciones de tipo de los constructores de tipo no GADT es que los parámetros de las funciones de tipo pueden ser no paramétricos, mientras que los parámetros de los constructores de tipo siempre son paramétricos. Esta distinción es importante para la corrección de la extensión GeneralizedNewTypeDeriving
. Para explicar esta distinción, los roles se introducen en Haskell.
Observaciones
Véase también SafeNewtypeDeriving
.
Papel nominal
Haskell Wiki tiene un ejemplo de un parámetro no paramétrico de una función de tipo:
type family Inspect x
type instance Inspect Age = Int
type instance Inspect Int = Bool
Aquí x
no es paramétrico porque para determinar el resultado de aplicar Inspect
a un argumento de tipo, la función de tipo debe inspeccionar x
.
En este caso, el papel de x
es nominal. Podemos declarar el rol explícitamente con la extensión RoleAnnotations
:
type role Inspect nominal
Papel representativo
Un ejemplo de un parámetro paramétrico de una función de tipo:
data List a = Nil | Cons a (List a)
type family DoNotInspect x
type instance DoNotInspect x = List x
Aquí x
es paramétrico porque para determinar el resultado de aplicar DoNotInspect
a un argumento de tipo, la función de tipo no necesita inspeccionar x
.
En este caso, el papel de x es representativo. Podemos declarar el rol explícitamente con la extensión RoleAnnotations
:
type role DoNotInspect representational
Papel fantasma
Un parámetro de tipo fantasma tiene un rol fantasma. Los roles fantasmas no pueden ser declarados explícitamente.