我有些困难,无法让我的代码将树的先序遍历转换为列表。树的定义如下:
data Tree a b = Branch b (Tree a b) (Tree a b)
| Leaf a
我的先序遍历定义如下:
先序遍历是指,在访问节点本身之前,先访问节点的左子树,然后是右子树。
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周围所有可行的括号组合,但没有一种可以成功运行。