7

En esta declaraciónHaskell - especificando tipo en la declaración de datos

data Const a = Const Integer 

Haskell infiere que Const es * -> *. ¿Es posible hacer que Const tome un constructor de tipo en su lugar, entonces será (* -> *) -> *? Idealmente, debería ser a -> *, pero no hay tipos polimórficos. This thread muestra una solución: agregar el constructor no utilizado. ¿Ha cambiado la situación desde 2002?

Respuesta

13

Tiene razón, dado que GHC no es compatible con tipos polimórficos, hará el tipo predeterminado en *.

Sin embargo, utilizando la extensión KindSignatures, puede anotar explícitamente una declaración de datos con un tipo específico:

{-# LANGUAGE KindSignatures #-} 

data Const (a :: * -> *) = Const Integer 

O, si eres un fan de GADT s:

{-# LANGUAGE GADTs #-} 

data Const :: (* -> *) -> * where 
    Const :: Integer -> Const a 

Ahora puede escribe:

x :: Const Maybe 
x = Const 2 

Acabo de compilar el programa original con el Utrecht Haskell Compiler experimental (UHC).

¡La UHC realmente no compila ningún programa del mundo real, pero sí admite polimorfismo! Su interesseting para verlo inferir:

-- kind of data type: 
Const :: forall a . a -> * 

-- type of constructor: 
Const :: Integer -> forall* a . forall b(a) . Const b 
Cuestiones relacionadas