'Equations have different numbers of arguments' 在判断一棵树是否完整时

'Equations have different numbers of arguments' when deciding whether a tree is complete or not

我想用一个函数来判断二叉树是否完整,但是编译器一直告诉我 "equations have different numbers of arguments"。

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

data BinaryTree a = Leaf a | Node (BinaryTree a) a (BinaryTree a)

...

decideComplete :: BinaryTree Int -> Bool
decideComplete (Node l _ r) = (decideComplete l) && (decideComplete r)
decideComplete Leaf v = True

decideComplete 函数采用 BinaryTree Int(也许您想将其概括为 BinaryTree a)。 Leaf 不是 BinaryTree a,它是一个带参数的数据构造函数,因此您应该添加括号,如:

decideComplete :: BinaryTree a -> Bool
decideComplete (Node l _ r) = (decideComplete l) && (decideComplete r)
decideComplete <b>(</b>Leaf v<b>)</b> = True

也就是说,您的函数将在这里为 all 树生成 True(当然除非树有无限数量的节点,但在那种情况下它只会陷入无限循环,或者 运行 内存不足)。事实上:对于所有 Leaf,它会 return True,对于 Node l _ r,它会 return True 给定 decideCompletelr 上,但这不可能 return False,因为最终子树将是 Leaf,因此该节点将是True,因此根据归纳法,您所有的 BinaryTree 都将是 True

为了检查一棵二叉树是否完整,除了最后一层之外的所有层次都应该是满的。最后一层应该包含尽可能最左边的节点。