在此声明中
data Const a = Const Integer
Haskell推断Const
是* -> *
。是否可以使Const
取代类型构造函数,因此它将是(* -> *) -> *
?理想情况下,它应该是a -> *
,但没有多态类型。 This thread显示了一个解决方案 - 添加未使用的构造函数。自2002年以来情况发生了变化吗?
答案 0 :(得分:13)
你是对的,因为GHC不支持多态类型,它会默认为*
。
但是,使用KindSignatures
扩展名,您可以显式注释具有特定类型的数据声明:
{-# LANGUAGE KindSignatures #-}
data Const (a :: * -> *) = Const Integer
或者,如果你的粉丝是GADT s:
{-# LANGUAGE GADTs #-}
data Const :: (* -> *) -> * where
Const :: Integer -> Const a
您现在可以写:
x :: Const Maybe
x = Const 2
我刚用实验Utrecht Haskell Compiler(UHC)编译原始程序。
UHC并没有真正编译任何真实世界的程序,但它支持多种多样性!它有点看到它推断:
-- kind of data type:
Const :: forall a . a -> *
-- type of constructor:
Const :: Integer -> forall* a . forall b(a) . Const b