我对haskell中函数`foldr`的类型感到困惑

时间:2017-06-02 00:11:28

标签: haskell

在书中" Haskell编程"中,foldr的定义是:

foldr :: (a -> b ->b) -> b -> [a] -> b
foldr f v [] = v
foldr f v (x:xs) = f x (foldr f v xs)

我无法理解f

原因f已应用于[a]a中的参数(a -> b -> b)显而易见。 参数v的类型为b,但最后b位于(a - > b - > b )和(a - > b - > b) - > b - > [a] - > b 很奇怪。

是否意味着函数ffoldr的结果具有b类型?怎么可能呢?

2 个答案:

答案 0 :(得分:3)

如果您承认v的类型为b,那么foldr 的结果的类型为b,因为{{1} }}是v的可能结果:

foldr

然后由于foldr f v [] = v 的结果必须为foldr,因此b的结果也必须为f,因为b结果是可能的f结果:

foldr

答案 1 :(得分:2)

foldr f v映射列表

x1 : x2 : ... : []
-- i.e., in prefix notation
(:) x1 ((:) x2 (...  []))

进入值

f x1 (f x2 (... v))

非正式地,它用(:)“替换”(或“解释”)f构造函数,用[]替换v构造函数。

从上面的公式中,我们可以看到f的结果被用作(多次)作为f的第二个参数。因此,它们必须具有相同的类型(b,在您的问题中)。 foldr的最终结果是最外层f的结果,因此它也是b的结果。