haskell - Haskellfoldr中的计算步骤

标签 haskell fold

有人知道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/

相关文章:

haskell - Haskell 中的纯错误处理,带有 : how to fold with error possibility?

apache-spark - 为什么在 Spark 中需要折叠 Action ?

f# - 如何在 F# 中实现 “efficient generalized fold”?

optimization - Foldl 是尾递归,那么为什么foldr 运行得比foldl 快呢?

forms - Haskell - 命题逻辑

list - 使用 'nub' 函数需要什么?

function - 当非 curry 形式已知时,在haskell中进行柯里化(Currying)

Vim - 在折叠上方添加一行到折叠

json - 在 Haskell 中构建 JSON 类型

haskell - 在 Mac OSX 上导入 haskell 库会出错