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

abh*_*hta 2 haskell

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

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)

但这会产生同样的错误.

dfe*_*uer 9

在标准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扩展.)

  • 实际上,启用"GATD"对于初学者来说是不合适的.然而,有一个较小的扩展名"GADTSyntax",它只启用新语法而不扩展数据类型声明的表达能力(即,每个构造函数必须返回一个"Bintree a"). (3认同)

Ale*_*ing 5

没有必要提供类型签名Nulltree.编译器已经清楚它是什么.

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

emptyTree :: Bintree Int -- for example
emptyTree = Nulltree
Run Code Online (Sandbox Code Playgroud)