Haskell中plusTree函数报错求助:构造器与参数数量问题
解决Haskell plusTree函数的构造器参数与参数数量错误
咱们一步步拆解你遇到的问题,再给出正确的实现方案:
第一个错误:构造器参数数量不匹配
你定义的Tree类型里,Node构造器需要3个参数:一个Int类型的节点值,加上左右两个子树(都是Tree类型)。但你在模式匹配时写成了Node x xs,只给了2个参数,这就触发了编译器的报错:
Constructor `Node' should have 3 arguments, but has been given 2
In the pattern: Node x xs
第二个错误:函数参数数量不一致
你修改代码时,错误地给plusTree的第三个方程加了第三个参数,但你的类型签名明确声明plusTree是接收两个Tree参数的函数,这就造成了函数各个方程的参数数量不统一,引发了新的报错:
'Equations for `plusTree' have different numbers of arguments'
正确的实现代码
下面是修正后的plusTree函数,完全符合你的类型定义和两棵树节点值相加的需求:
data Tree = Null | Node Int Tree Tree deriving Show plusTree :: Tree -> Tree -> Tree -- 边界情况:只要其中一棵树是空树,返回空树(保留你原有的逻辑) plusTree Null _ = Null plusTree _ Null = Null -- 匹配两棵树都是节点的情况,递归处理当前节点值、左子树、右子树 plusTree (Node x left1 right1) (Node y left2 right2) = Node (x + y) (plusTree left1 left2) (plusTree right1 right2)
额外优化建议
如果你希望逻辑更贴合“节点值相加”的直觉(空树相当于所有节点值为0,相加后等于另一棵树的结构),可以把边界条件改成这样:
plusTree Null ys = ys plusTree xs Null = xs
这样当其中一棵是空树时,直接返回另一棵树,而不是强制返回空树。
内容的提问来源于stack exchange,提问作者love Croquembouch
相关产品推荐
相关产品推荐

