Haskell 二叉树折叠函数

Haskell 二叉树折叠函数,haskell,binary-tree,fold,Haskell,Binary Tree,Fold,我在Haskell中对二叉树的定义如下: data BTree x = Nil | BNode x (BTree x) (BTree x) 然后,我对该数据类型有一个折叠定义: foldB :: (x -> u -> u -> u) -> u -> BTree x -> u foldB f a Nil = a foldB f a (BNode x l r) = f x (foldB f a l)(foldB f a r) 所以我希望我可以简单地用这个函数来

我在Haskell中对二叉树的定义如下:

data BTree x = Nil | BNode x (BTree x) (BTree x)
然后,我对该数据类型有一个折叠定义:

foldB :: (x -> u -> u -> u) -> u -> BTree x -> u
foldB f a Nil = a
foldB f a (BNode x l r) = f x (foldB f a l)(foldB f a r)
所以我希望我可以简单地用这个函数来求所有值的和:

sumBFold :: (Num a) => BTree a -> a
sumBFold x = foldB (+) 0 x
但这是行不通的,我一辈子也不知道为什么。 我收到的错误消息的有用部分是:

Couldn't match type `a` with `a -> a'
`a' is a rigid type variable bound by the type signature for:
sumBFold :: forall a. Num a => BTree a -> a
Expected type: (a -> a) -> a -> a -> a
Actual type: (a -> a) -> (a -> a) -> a -> a
In the first argument of folB namely `(+)`

错误源于尝试使用

(+) :: (Num a) => a -> a -> a
作为类型为的参数

(x -> u -> u -> u)
如果您开始尝试将其放入,请记住
(x->u->u->u)
(x->(u->(u->u)))相同

这是不可能的,错误来自哪里

考虑以下任何一种情况

sumBFold :: (Num a) => BTree a -> a
sumBFold = foldB add3 where add3 x y z = x + y + z
sumBFold = foldB $ \x y z -> x + y + z
sumBFold = foldB ((.) (+) . (+))

您需要传递到
foldB
的函数需要3个参数,而
(+)
只需要两个参数。感谢您回答的清晰。我对函数式编程还是新手,很容易被类型所抛弃
sumBFold :: (Num a) => BTree a -> a
sumBFold = foldB add3 where add3 x y z = x + y + z
sumBFold = foldB $ \x y z -> x + y + z
sumBFold = foldB ((.) (+) . (+))