在书中" 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 很奇怪。
是否意味着函数f
和foldr
的结果具有b
类型?怎么可能呢?
答案 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
的结果。