Haskell预订遍历树列表

时间:2014-10-07 04:59:10

标签: haskell tree traversal preorder

我无法让我的代码执行树的前序遍历到列表工作。树的定义如下:

data Tree a b = Branch b (Tree a b) (Tree a b)
          | Leaf a

我对preorder遍历的定义如下:

preorder  :: (a -> c) -> (b -> c) -> Tree a b -> [c]
preorder f g (Leaf b) = [g b]
preorder f g (Branch a left right) = [f a] ++ preorder f g left ++ preorder f g right

然而,我得到的错误是:

Couldn't match type `b' with `a'
  `b' is a rigid type variable bound by
      the type signature for
        preorder :: (a -> c) -> (b -> c) -> Tree a b -> [c]
  `a' is a rigid type variable bound by
      the type signature for
        preorder :: (a -> c) -> (b -> c) -> Tree a b -> [c]
In the first argument of `f', namely `a'
In the expression: f a
In the first argument of `(++)', namely `[f a]'

我知道我的问题是该函数的第一个参数的类型以及它如何需要类型[c],但我无法弄清楚如何得到它。我已尝试围绕f a的所有括号组合而没有括号,没有一个给我一个成功的运行。

1 个答案:

答案 0 :(得分:4)

您已经将类型或函数调用混淆了 - 可能是类型,给出了您为变量命名的方式。

您已经说Tree a b在其第一个参数中有b,但f的{​​{1}}参数需要preorder。同样地,a需要Leaf,但您在其上调用a,这需要g

错误消息告诉您的内容:您传递给b的第一个参数的类型为f,当它预期为b时。

如果您将数据类型更改为:

a

然后你的代码编译得很好。

或者将data Tree a b = Branch a (Tree a b) (Tree a b) | Leaf b 更改为

preorder