在这份声明中
data Const a = Const Integer
Haskell 推断Const
是* -> *
. 是否可以改为Const
使用类型构造函数,所以它会是(* -> *) -> *
?理想情况下,它应该是a -> *
,但没有多态种类。该线程显示了一种解决方案 - 添加未使用的构造函数。自 2002 年以来情况是否发生了变化?
在这份声明中
data Const a = Const Integer
Haskell 推断Const
是* -> *
. 是否可以改为Const
使用类型构造函数,所以它会是(* -> *) -> *
?理想情况下,它应该是a -> *
,但没有多态种类。该线程显示了一种解决方案 - 添加未使用的构造函数。自 2002 年以来情况是否发生了变化?
你是对的,因为 GHC 不支持多态种类,它会做 kind 默认为*
.
但是,使用KindSignatures
扩展,您可以使用特定类型显式注释数据声明:
{-# LANGUAGE KindSignatures #-}
data Const (a :: * -> *) = Const Integer
或者,如果您是 GADT的粉丝:
{-# 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