我在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 `(+)`
答案 0 :(得分:1)
错误来自于尝试使用
(+) :: (Num a) => a -> a -> a
作为类型为
的参数(x -> u -> u -> u)
如果您开始尝试使用它,请记住(x -> u -> u -> u)
与(x -> (u -> (u -> u)))
相同,
x == a
u == a
u -> u == a -> a == a
这是不可能的,错误来自哪里。
考虑以下任何一种情况。
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 ((.) (+) . (+))