有人知道haskell 'foldr'函数的使用步骤吗?
GHCI 命令窗口:
foldr (\x y -> 2*x + y) 4 [5,6,7]
评估后的结果:
40
执行此操作,
Prelude> foldr (\x y -> 2*x + y) 4 [5,6,7]
6 * 2 + (7 * 2 + 4)
12 + 18 = 30
5 * 2 + 30 = 40 v
最佳答案
foldr 的一个定义是:
foldr :: (a -> b -> b) -> b -> [a] -> b
foldr f acc [] = acc
foldr f acc (x:xs) = f x (foldr f acc xs)
wikibook on Haskell在foldr(以及其他折叠)上有一个很好的图表:
: f
/ \ / \
a : foldr f acc a f
/ \ -------------> / \
b : b f
/ \ / \
c [] c acc
即a : b : c : []
(即 [a, b, c]
)变为 f a (f b (f c acc))
(再次,取自维基百科)。
因此,您的示例被评估为 let f = (\x y -> 2*x + y) in f 5 (f 6 (f 7 4))
(let 绑定(bind)仅为了简洁起见) .
关于haskell - Haskellfoldr中的计算步骤,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3529423/