我正在学习哈斯克尔。当我编译代码时:
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
但这会产生同样的错误。
答案 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