Haskell - Foldl 和 Foldr?

2024-01-08

之间的区别是foldl and foldr只是循环的方向?我认为他们所做的事情有所不同,而不仅仅是方向上的不同?


如果您的函数不具有关联性(即,用括号括起表达式的方式很重要),则存在差异,例如,
foldr (-) 0 [1..10] = -5 but foldl (-) 0 [1..10] = -55.
这是因为前者等于1-(2-(3-(4-(5-(6-(7-(8-(9-(10 - 0))))))))),而后者是(((((((((0-1)-2)-3)-4)-5)-6)-7)-8)-9)-10.

而因为(+)是关联的(与添加子表达式的顺序无关),
foldr (+) 0 [1..10] = 55 and foldl (+) 0 [1..10] = 55. (++)是另一个关联运算,因为xs ++ (ys ++ zs)给出相同的答案(xs ++ ys) ++ zs(虽然第一个更快 - 不要使用foldl (++)).

有些函数只能以一种方式工作:
foldr (:) :: [a] -> [a] -> [a] but foldl (:)纯属无稽之谈。

Have a look at Cale Gibbard's diagrams (from the wikipedia article http://en.wikipedia.org/wiki/Fold_(higher-order_function)); you can see f getting called with genuinely different pairs of data:
foldrfoldl

另一个区别是,因为它与列表的结构匹配,foldr对于惰性评估通常更有效,因此可以与无限列表一起使用,只要f它的第二个参数是非严格的(比如(:) or (++)). foldl很少是更好的选择。如果您正在使用foldl通常值得使用foldl'因为它很严格,会阻止您建立一长串中间结果。 (有关此主题的更多信息,请参见以下问题的答案这个问题 https://stackoverflow.com/questions/3429634/foldl-is-tail-recursive-so-how-come-foldr-runs-faster-than-foldl.)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Haskell - Foldl 和 Foldr? 的相关文章

  • 用于遇到 [...] 的 Haskell Parsec 解析器

    我正在尝试使用 Parsec 在 Haskell 中编写一个解析器 目前我有一个可以解析的程序 test x 1 2 3 end 执行此操作的代码如下 testParser do reserved test v lt identifier
  • 为什么 ZipList 不是 List 的默认应用实例

    我目前正在学习 Haskell 中的应用程序 如果我没记错的话 列表有两个不同的应用实例 List and ZipList 第二个被定义为包装列表值的新类型 这ZipList应用实例对我来说似乎更直观 这可能是一个愚蠢的问题 但有具体原因吗
  • 不同编程语言中的浮点数学

    我知道浮点数学充其量可能是丑陋的 但我想知道是否有人可以解释以下怪癖 在大多数编程语言中 我测试了 0 4 到 0 2 的加法会产生轻微的错误 而 0 4 0 1 0 1 则不会产生错误 两者计算不平等的原因是什么 在各自的编程语言中可以采
  • 如何在不声明新数据的情况下更改类型(String,Int)元组的 Ord 实例?

    我正在尝试对类型列表进行排序 String Int 默认情况下 它按字符串排序 然后按整数排序 如果字符串相等 我希望它是相反的 首先比较整数 然后如果相等则比较字符串 另外 我不想切换到 Int String 我找到了一种通过定义实例来实
  • Haskell:不在范围内:数据构造函数

    今天开始在学校学习 haskell 我遇到了函数问题 我不明白为什么它不在范围内 代码如下 ff Char gt Char gt Char ff A B x 0 y 1 x lt A y lt B x 1 y 0 和错误 md31 hs 2
  • Haskell Data.Decimal 作为 Aeson 类型

    是否可以解析一个数据 十进制 https hackage haskell org package Decimal 0 4 2 docs Data Decimal html使用 Aeson 包从 JSON 获取 假设我有以下 JSON foo
  • ST monad 是如何工作的?

    我知道 ST monad 有点像 IO 的弟弟 而 IO 又是添加了状态 monadRealWorld魔法 我可以想象状态 也可以想象 RealWorld 以某种方式放入 IO 中 但每次我写一个类型签名ST the sST monad 的
  • 我是否需要采取明确的操作来促进与持久数据结构的共享?

    我来自命令式背景 正在尝试实现一个简单的不相交集 并集查找 数据结构 以获得在 Haskell 中创建和修改 持久 数据结构的一些练习 目标是有一个简单的实现 但我也关心效率 我的问题与此相关 首先 我创建了一个按等级并集的不相交集森林实现
  • Haskell:需要了解 Functor 的签名

    有人能给我解释一下 Functor 的签名吗 Prelude gt info Functor class Functor f gt where fmap a gt b gt f a gt f b lt a gt f b gt f a 我不明
  • 如何在haskell中用另一个字符串替换一个字符串

    我想用不同的字符串替换输入文件中的字符串 我正在寻找一种方法 但似乎我只能逐个字符地更改字符串 例如在我下面的代码中 replace String gt String replace replace x xs if x then y rep
  • 在 Haskell 中获取玫瑰树的根

    最近我开始学习 Haskell 并在以下练习中遇到困难 Write functions root Rose a gt a and children Rose a gt Rose a that return the value stored
  • 在 Haskell 中将字符串转换为整数/浮点数?

    data GroceryItem CartItem ItemName Price Quantity StockItem ItemName Price Quantity makeGroceryItem String gt Float gt I
  • 如何在 Haskell Pipes 中将两个 Consumer 合并为一个?

    我使用Haskell流处理库pipes https hackage haskell org package pipes编写一个命令行工具 每个命令行操作都可以将结果输出到stdout并记录到stderr with pipes API I n
  • cabal install wx 缺少 C 库

    Env 操作系统 feodra 16 Haskell 平台 wxGTK 开发 GHHC 7 0 4 我正在尝试安装 wxHaskell 阴谋集团安装wx 然后给出这些错误 缺少对外国库的依赖 缺少 C 库 wx baseu 2 8 wx b
  • Data.Array 有多快?

    The 文档 http haskell org ghc docs latest html libraries array 0 3 0 3 Data Array html of Data Array reads Haskell 提供了可索引数
  • 如何在 Haskell 中使 CAF 不是 CAF?

    如何将常量应用形式变成 而不是常量应用形式 以阻止它在程序的生命周期中保留 我尝试过这种方法 Dummy parameter to avoid creating a CAF twoTrues gt Bool twoTrues map Tru
  • 优化 Haskell 内循环

    仍在 Haskell 中进行 SHA1 实现 我现在已经有了一个有效的实现 这是内部循环 iterateBlock Int gt Word32 gt Word32 gt Word32 gt Word32 gt Word32 gt Word3
  • 在 Archlinux 上使用 Vim 作为 Haskell 的 IDE 目前情况如何?

    如果可行的话 我的目标是通过 YouCompleteMe 在 Vim 中完成 Haskell 的命令 在这方面 正如您在下面看到的 我还没有找到关于如何让它发挥作用的共识 相关评论的最新评论YouCompleteMe 上的问题 https
  • 如何测试自定义 StateT 的 Monad 实例?

    我正在学习 Monad Transformers 其中一个练习要求实现 Monad 实例StateT 我想使用以下方法测试我的实现是否符合 Monad 法则validity https github com NorfairKing vali
  • 如何与更高级别的类型合作

    玩弄教堂的数字 我遇到了无法指导 GHC 类型检查器处理高阶类型的情况 首先我写了一个版本 没有任何类型签名 module ChurchStripped where zero z z inc n z s s n z s natInteger

随机推荐

  • 如何在 Apache 服务器中部署 Web 应用程序 Aurelia?

    为了进行尝试 我使用了最新的 aurelia sculpture navigation 1 0 0 beta 1 0 1 为了在 Apache 服务器中部署 Aurelia Web 应用程序 我使用了 gulp export 命令 并将 e
  • 滚动后颤动 ListView KeepAlive

    我想要keepAlive我的小部件已经渲染在ListView 我被尝试过addAutomaticKeepAlives true提供的属性ListView class 这是我使用的示例代码 同样的问题在SliverChildBuilderDe
  • htaccess 密码保护,但不在本地主机上

    我已经建立了一个开发网站 并希望对其进行密码保护 以便只有经过验证的访问者才能查看该网站 一切都很好 我很恼火 在我的本地版本上输入我的用户名和密码 那么 在不更改本地副本和开发站点上的 htaccess 文件之间的情况下 如何使用密码保护
  • 节点获取仅返回待处理的承诺

    我正在尝试node fetch我得到的唯一结果是 Promise
  • `-rdynamic` 到底有什么作用以及什么时候需要它?

    到底是做什么的 rdynamic or export dynamic在链接器级别 做什么以及它如何与定义的符号可见性相关 fvisibility 标志或可见性pragmas and attribute s For export dynami
  • 如何从Windows应用程序内存中读取一些数据?

    我有一个应用程序 它向我显示一些数据 我需要附加到这个应用程序的进程 在内存中找到我需要的数据 实际上是一个数字 并将其保存在某个地方 该应用程序似乎没有使用标准的 Windows 控件 因此事情不会像使用 AutoIt 或类似的东西读取控
  • 动态生成Linq Select

    我有一个数据库 用户可以在其上运行各种计算 计算在 4 个不同的列上运行 每个计算不一定使用每个列 即 calculation1 可能会变成 sql 之类 SELECT SUM Column1 FROM TABLE WHERE Column
  • 如何使用 Ruamel.yaml 在某些数据之前添加空行

    我似乎无法弄清楚如何使用 Ruamel yaml 在数据之间添加空行 假设我有数据 a 1 b 2 我需要添加到此 以便我将 a 1 b 2 c 3 据我所知 空行是作为 CommentToken 实现的 Comment comment N
  • IE 权限被拒绝

    我在 IE 上收到权限被拒绝的错误 firefox 工作正常 我正在进行 ajax 调用 本地域 并将调用结果分配给 div 在调试时 我发现 ajax 调用没有问题 并且变量 结果 具有结果数据 将数据分配给 div 时会引发错误 Err
  • pageshow/pagehide 事件未触发

    我碰到pageshow pagehide事件 但我不太确定它们是如何工作的 我将它们注册在document 以及稍后window反对 但他们从未开枪 我预计它们会在页面加载后触发pageshow 当我转到其他页面时pagehide 但这从未
  • 如何更改 Angular Material CdkDroplist 行为以模拟“自由”放置区?

    目标是创建一个全宽拖放区 我可以在其中放置 小部件 并在放置区周围自由拖动它们 但不同的是 我还可以删除列表小部件 其中我也可以删除其他小部件 所以我有这个堆栈闪电战 https stackblitz com edit angular fr
  • Android 版 Google plus:凭据无效

    我使用以下代码来获取访问令牌 在连接到 Google 后 获取个人资料信息和电子邮件 String sAccessToken GoogleAuthUtil getToken this mPlusClient getAccountName o
  • Web 表单脚手架而不是 MVC

    可以使用 Web 表单代码搭建脚手架吗 thanks ASP NET 动态数据 http www asp net dynamicdata是一个应该与 Web 表单和 MVC 一起使用的脚手架解决方案
  • C# 中浮点和双精度数据类型的实际范围是多少?

    我正在学习 C 并试图获得 C 中数据类型实际范围的逻辑视觉表示 我已经介绍了整数 现在介绍了浮点和双精度数据类型 8 位 1 字节 sbyte 128 到 127 8 位 1 字节 字节 0 到 255 16 位 2 字节 短 32 76
  • Safari 6 中未设置 Cookie

    晚上好 这个问题我已经问过几次了 没有得到答复 希望这次一切顺利 我使用 php 和 Facebook PHP SDK 开发 Facebook 应用程序已经有几年了 最近我一直在为 Safari 和 Facebook 的登录而烦恼 问题是
  • dc.js 带复选框的多选菜单

    我有一个数据集 其中包含 5 列 gt 国家 地区 ID 值和部门 我能够使用值和国家 地区在 dc js 中创建行图 其中国家 地区是我的维度 var rowChart dc rowChart rowChart d3 csv data c
  • g++ 错误:“malloc”未在此范围内声明

    我在 Fedora 下使用 g 编译 openGL 项目 其中包含以下行 textureImage GLubyte malloc sizeof GLubyte RESOURCE LENGTH 编译时 g 错误提示 error malloc
  • 修剪字符串中的最后一个字符

    我有一个字符串说 Hello world 我想做一个修剪或移除以取出 关世界但不关你好 Hello world TrimEnd 阅读更多 https msdn microsoft com en us library 64zz6w66 v v
  • JScrollPane 中的 JTable 具有可调整大小的 JFrame 固定大小?

    我有一个JTable里面的一个JScrollPane 我想让列在调整大小时保持固定 行保持相同的大小 并且有一个滚动条可以上下移动 但我无法让滚动条在垂直方向上以相同的方式工作 这是我的项目的图片 其中 Duke 的 y 轴完全正常 并且有
  • Haskell - Foldl 和 Foldr?

    之间的区别是foldl and foldr只是循环的方向 我认为他们所做的事情有所不同 而不仅仅是方向上的不同 如果您的函数不具有关联性 即 用括号括起表达式的方式很重要 则存在差异 例如 foldr 0 1 10 5 but foldl