有没有办法在Haskell中解决不同数量的参数?

时间:2018-05-22 07:38:16

标签: haskell

您好我想定义plusTree

对此的定义。

enter image description here

data Tree = Null | Node Int Tree Tree   deriving Show


plusTree :: Tree -> Tree -> Tree
plusTree Null         ys     = Null
plusTree xs          Null    = Null
plusTree (Node x xs) (Node y ys)  = Node (x+y) (plusTree xs ys) 

我创建了上面的代码。

  

构造函数`Node'应该有3个参数,但已经给出了2个

     

在模式中:节点x xs

     

在`plusTree':plusTree(Node x xs)(Node y ys)= Node的等式中   (x + y)(互动:IHaskell544.plusTree xs ys)

我也遇到了上述错误。所以我尝试了各种方法。我最后虽然在第四个参数中添加一些内容时它会起作用。

plusTree :: Tree -> Tree -> Tree
plusTree Null         ys     = Null
plusTree xs          Null    = Null
plusTree (Node x xs) (Node y ys)(Node z zs)  = Node (x+y+z) (plusTree xs ys zs)

现在我又遇到了另一个错误。我也尝试了几种方法。但无法修复它。

  

'`plusTree'的等式有不同数量的论点'

     

:2:1-35

     

:4:1-79

有人可以提供建议或解决方案来帮助我吗?现在我被阻挡了。

2 个答案:

答案 0 :(得分:6)

编译器抱怨plusTree函数的参数数量。它抱怨你的Node构造函数应该有三个参数。事实上:

data Tree = Null | Node Int Tree Tree deriving Show

这里您将Node定义为数据构造函数,它有三个参数:Int和两个Tree。但是在你的函数中,你只写了两个:

plusTree (Node x xs) (Node y ys) = Node (x+y) (plusTree xs ys) 

因此,这不是一个正确的Node实例。

我假设这是某种二进制树,其中第二个参数是 left 子树,第三个参数是 right 子树。在这种情况下,我们需要执行双递归:

plusTree :: Tree -> Tree -> Tree
plusTree Null         ys     = Null
plusTree xs          Null    = Null
plusTree (Node x lx rx) (Node y ly ry) = Node (x+y) (plusTree lx ly) (plusTree rx ry)

第一个子句定义了您不使用的变量xsys。在这种情况下,通常使用下划线,这样如果我们打开所有警告,编译器就不会抱怨未使用的变量:

plusTree :: Tree -> Tree -> Tree
plusTree Null _ = Null
plusTree _ Null = Null
plusTree (Node x lx rx) (Node y ly ry) = Node (x+y) (plusTree lx ly) (plusTree rx ry)

答案 1 :(得分:4)

编译器告诉您在这一行中应用了节点错误:

plusTree (Node x xs) (Node y ys) = Node (x+y) (plusTree xs ys) 

因为节点采用“Int Tree Tree”并且您尝试将其与“x xs”匹配

哦,那2个先前的案例是等于0 + n对吗? 他们不应该是n吗?

更改了代码:

    plusTree :: Tree -> Tree -> Tree
    plusTree Null         ys     = ys
    plusTree xs          Null    = xs
    plusTree (Node x lxTree rxTree) (Node y lyTree ryTree)  = 
        Node (x+y) (plusTree lxTree lyTree) (plusTree rxTree lyTree)