我正在学习哈斯克尔.当我编译代码时:
data Bintree a = Nulltree | Node (Bintree a) a (Bintree a)
Nulltree :: Bintree a
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
Invalid type signature: Nulltree :: Bintree a Should be of form <variable> :: <type>
Run Code Online (Sandbox Code Playgroud)
那我该怎么做呢?我试着写:
data Bintree a = Nulltree | Node (Bintree a) a (Bintree a)
Nulltree :: a -> Bintree a
Run Code Online (Sandbox Code Playgroud)
但这会产生同样的错误.
在标准Haskell中,您不能为数据构造函数提供类型签名.这条线
data Bintree a = Nulltree | Node (Bintree a) a (Bintree a)
Run Code Online (Sandbox Code Playgroud)
意味着Nulltree :: BinTree a.你不需要自己说,你也不能.使用GADTSyntax语言扩展,您可以改为编写
data Bintree a where
Nulltree :: BinTree a
Node :: Bintree a -> a -> Bintree a -> Bintree a
Run Code Online (Sandbox Code Playgroud)
(感谢chi指出这GADTSyntax已经足够了,并且不需要不那么初学者友好的GADTs扩展.)
没有必要提供类型签名Nulltree.编译器已经清楚它是什么.
如果你想创建一个特定的空树,你可以去:
emptyTree :: Bintree Int -- for example
emptyTree = Nulltree
Run Code Online (Sandbox Code Playgroud)