我正在学习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


但这给出了相同的错误。

最佳答案

在标准的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扩展名。)

08-16 06:45