编译器拒绝数据构造函数的类型签名

时间:2015-09-16 05:18:32

标签: haskell

我正在学习哈斯克尔。当我编译代码时:

data Bintree a = Nulltree | Node (Bintree a) a (Bintree a)
Nulltree :: Bintree a

我收到以下错误:

Invalid type signature: Nulltree :: Bintree a Should be of form <variable> :: <type>

那我该怎么做呢?我试着写:

data Bintree a = Nulltree | Node (Bintree a) a (Bintree a)
Nulltree :: a -> Bintree a

但这会产生同样的错误。

2 个答案:

答案 0 :(得分:9)

在标准Haskell中,您不能为数据构造函数提供类型签名。这条线

data Bintree a = Nulltree | Node (Bintree a) a (Bintree a)

表示Nulltree :: BinTree a。你不需要自己说,你也不能。使用GADTSyntax语言扩展名,您可以改为编写

data Bintree a where
  Nulltree :: BinTree a
  Node :: Bintree a -> a -> Bintree a -> Bintree a

(感谢chi指出GADTSyntax已足够,并且不需要不那么初学者友好的GADTs扩展名。)

答案 1 :(得分:5)

无需为Nulltree提供类型签名。编译器已经清楚它是什么了。

如果你想创建一个特定的空树,你可以去:

emptyTree :: Bintree Int -- for example
emptyTree = Nulltree