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.



Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow