sdc*_*vvc 7 haskell types functional-programming higher-kinded-types
在这个宣言中
data Const a = Const Integer
Run Code Online (Sandbox Code Playgroud)
Haskell推断出的Const是* -> *.是否可以改为Const采用类型构造函数,所以它会是(* -> *) -> *?理想情况下,它应该是a -> *,但没有多态类型.此线程显示一个解决方案 - 添加未使用的构造函数 自2002年以来情况发生了变化吗?
Tom*_*rst 13
你是对的,因为GHC不支持多态类型,它会做什么样的默认*.
但是,使用KindSignatures扩展名,您可以显式注释具有特定类型的数据声明:
{-# LANGUAGE KindSignatures #-}
data Const (a :: * -> *) = Const Integer
Run Code Online (Sandbox Code Playgroud)
或者,如果你是GADT的粉丝 :
{-# LANGUAGE GADTs #-}
data Const :: (* -> *) -> * where
Const :: Integer -> Const a
Run Code Online (Sandbox Code Playgroud)
你现在可以写:
x :: Const Maybe
x = Const 2
Run Code Online (Sandbox Code Playgroud)
我刚刚用实验性的Utrecht Haskell编译器(UHC)编译了原始程序.
UHC并没有真正编译任何真实世界的程序,但它支持多种类型!它有点看到它推断:
-- kind of data type:
Const :: forall a . a -> *
-- type of constructor:
Const :: Integer -> forall* a . forall b(a) . Const b
Run Code Online (Sandbox Code Playgroud)