Haskell ';方程有不同数量的参数';当决定一棵树是否完整时

Haskell ';方程有不同数量的参数';当决定一棵树是否完整时,haskell,binary-tree,Haskell,Binary Tree,我试图用一个函数来决定一个二叉树是否完整,但编译器一直告诉我“方程有不同数量的参数” 我猜错误是关于语法的,但我就是找不到正确的格式 data BinaryTree a=Leaf a |节点(BinaryTree a)a(BinaryTree a) ... decideComplete::BinaryTree Int->Bool decideComplete(节点l r)=(decideComplete l)&(decideComplete r) decideComplete叶v=真 您deci

我试图用一个函数来决定一个二叉树是否完整,但编译器一直告诉我“方程有不同数量的参数”

我猜错误是关于语法的,但我就是找不到正确的格式

data BinaryTree a=Leaf a |节点(BinaryTree a)a(BinaryTree a)
...
decideComplete::BinaryTree Int->Bool
decideComplete(节点l r)=(decideComplete l)&(decideComplete r)
decideComplete叶v=真

decideComplete
函数接受一个
BinaryTree Int
(也许您想将其推广到
BinaryTree a
Leaf
不是一个
BinaryTree a
,它是一个接受参数的数据构造函数,因此应该添加括号,如:

decideComplete :: BinaryTree a -> Bool
decideComplete (Node l _ r) = (decideComplete l) && (decideComplete r)
decideComplete (Leaf v) = True
decideComplete::二进制树a->Bool
decideComplete(节点l r)=(decideComplete l)&(decideComplete r)
decideComplete(叶v)=真

这就是说,您的函数将在这里为所有树生成
True
(当然,除非树有无限多的节点,但在这种情况下,它只会陷入无限循环,或者耗尽内存)。事实上:对于所有
Leaf
它将返回
True
,对于
节点l\ur
,它将返回
True
给定的
decideComplete
l
r
上,但这不可能返回
False
,因为最终子树将是
Leaf
,因此,该节点将是
True
,通过归纳,所有的
BinaryTree
s将是
True


为了检查二叉树是否完整,除最后一个之外的所有级别都应该是完整的。最后一级应该包含尽可能最左侧的节点。

您应该使用括号,因此
(叶v)
而不是
叶v
。如果
l
r
是不同高度的完整树,
节点l\uR
不完整,但您的代码声明不完整。您可以尝试使用一个辅助函数来计算高度。或者,让函数返回“树已完成且高度为H”或“树未完成”。您可以使用
Int()
可能Int
作为返回类型,或者-更好地-定义自定义类型
数据结果=Complete Int | NotComplete
“也就是说,您的函数将在这里为所有树生成True。”而不是为无限树(你显然知道这一点,但对于其他阅读答案的人来说可能仍然值得一提)。谢谢你回答这个问题!我现在已经解决了XD