Haskell foldr中的计算步骤

Yoo*_*Lee 3 haskell fold

有没有人知道haskell'foldr'使用函数的步骤?

GHCI命令窗口:

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))(仅为了简洁而让绑定).