有没有人知道haskell'foldr'使用函数的步骤?
foldr (\x y -> 2*x + y) 4 [5,6,7]
Run Code Online (Sandbox Code Playgroud)
40
Run Code Online (Sandbox Code Playgroud)
Prelude> foldr (\x y -> 2*x + y) 4 [5,6,7]
6 * 2 + (7 * 2 + 4)
12 + 18 = 30
5 * 2 + 30 = 40 v
Run Code Online (Sandbox Code Playgroud)
小智 7
foldr的一个定义是:
foldr :: (a -> b -> b) -> b -> [a] -> b
foldr f acc [] = acc
foldr f acc (x:xs) = f x (foldr f acc xs)
Run Code Online (Sandbox Code Playgroud)
在对哈斯克尔维基对foldr相似一个不错的图形(以及其他褶皱,太):
: f
/ \ / \
a : foldr f acc a f
/ \ -------------> / \
b : b f
/ \ / \
c [] c acc
Run Code Online (Sandbox Code Playgroud)
即a : b : c : [](只是[a, b, c])变成f a (f b (f c acc))(再次,取自wikibook).
因此,您的示例被评估为let f = (\x y -> 2*x + y) in f 5 (f 6 (f 7 4))(仅为了简洁而让绑定).