Clojure clojure.core.reducers/fold 和 Scala Fold 有什么区别?

2024-04-05

我发现 Clojure 有clojure.core.reducers/fold功能。

Scala 还内置了fold功能但无法理解它们的工作方式是否不同?


我假设你正在谈论clojure.core.reducers/fold https://clojure.org/reference/reducers#_reduce_and_fold.

Scala 的默认值fold https://www.scala-lang.org/api/2.12.3/scala/collection/Seq.html序列的实现非常简单:

collection.fold(identityElem)(binOp)

简单地从identityElem然后顺序遍历集合,并应用二元运算binOp已累加的结果和当前序列值,例如

(1 to 3).fold(42000)(_ + _)

将导致42000 + 1 + 2 + 3 = 42006.

Clojure 的fold并有完整签名

(r/fold n combinef reducef coll)

上面提到的包分两个阶段并行工作。首先,它将输入分成较小的组n(大约),然后使用reducef,最后使用combinef.

主要区别在于combinef预计都是零值and同时是二进制的(Clojure 有多元函数),并且(combinef)(不带参数)将被调用来为每个分区生成单位元素(因此,本文档 https://clojure.github.io/clojure/clojure.core-api.html#clojure.core.reducers/fold是正确的,并且本文档 https://clojure.org/reference/reducers#_reduce_and_fold lies).

也就是说,为了模拟上面示例中的 Scala 折叠,必须编写如下内容:

(require '[clojure.core.reducers :as r])

(r/fold 3 (fn ([] 42000) ([x y] y)) + [1 2 3])

一般来说,Scala 的fold

collection.fold(identityElement)(binOp)

可以通过以下方式模拟reducers/fold如下:

(r/fold collectionSize (fn ([] identityElem) ([x y] y)) binOp collection)

(注意([x y] y)抛弃第一个参数的装置,这是故意的)。

我猜这个接口不适合与任何非幺半群的零二进制操作一起使用,这就是 Scala 的原因fold使用 Clojure 进行模拟非常尴尬fold。如果你想要像 Scala 那样的东西fold, use reduce在 Clojure 中。


EDIT

等一下。该文档实际上指出

ombinef 必须是关联的,并且当调用时没有 参数,(combinef) 必须产生其单位元

也就是说,我们实际上是forced使用幺半群作为combinef,所以上面的42000, ([x y] y)-example 实际上是无效的,并且行为实际上是未定义的。事实上我以某种方式得到了42006出来是一个hack从严格的技术意义上来说,它依赖于库函数的未定义行为来获得所需的结果42006.

考虑到这些额外的信息,我不确定 Scala 是否fold可以用Clojure的来模拟core.reducers/fold根本不。 Clojure 的fold似乎仅限于使用幺半群进行约简,而 Scala 的折叠更接近一般的List变形,以牺牲并行性为代价。

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

Clojure clojure.core.reducers/fold 和 Scala Fold 有什么区别? 的相关文章

随机推荐

  • 使用 numpy 保存列表时内存不足

    我有一个相当大的列表 代表搜狗文本分类数据集中的标记 我可以处理 450 000 的整个训练集 并剩下 12 GB 的内存 但是当我在列表列表上调用 numpy save 时 内存使用量似乎增加了一倍 并且内存不足 为什么是这样 numpy
  • 在预构建的 docker 容器中更改用户的 uid (jenkins)

    我是 docker 的新手 所以如果这是我遗漏的一个相当明显的过程 我确实为前面的愚蠢问题道歉 我正在使用以下命令设置持续集成服务器jenkins泊坞窗图像 我做了一个docker pull jenkins 并创建了一个用户jenkins让
  • 浏览器中的图像缓存 - app-engine-patch 应用程序

    我在浏览器中为应用程序引擎应用程序缓存图像时遇到一些问题 我正在发送上次修改 过期和缓存控制标头 但每次都会从服务器加载图像 这是代码的标题部分 响应 内容类型 图像 jpg 响应 上次修改 current time strftime a
  • 如何将 Google Sheet 中的日期转换为字符串

    我想弄清楚如何将日期转换为谷歌表中的字符串 我有一个具有不同格式的日期字段 我想创建另一个与字面意思相同但作为文本的列 例如 如果我有以下数据 date date as string 12 05 2016 12 05 2016 12 5 2
  • 转储文件分析

    Recently I start facing issue on few servers where CPU start consuming more resources than usual trend I am trying to fi
  • VB.Net:如何在CEF中安装插件/扩展?

    我正在制作一个 vb net 网络浏览器 以及我正在使用的浏览引擎ChromeWebBrowser Net https sourceforge net projects chromewebbrowse source recommended
  • 在Windows操作系统中隐藏C程序的控制台

    我想在运行应用程序时隐藏我的 C 控制台 如何让我的应用程序在后台运行 程序与main 默认情况下编译为 SUBSYSTEM CONSOLE 应用程序并获取控制台窗口 如果您拥有应用程序正在启动的其他进程 则可以通过以下方法之一将它们修改为
  • 这些诸如 TFS 之类的多文档图标是什么意思?

    有谁知道 TFS 2017 源代码管理资源管理器中这些图标的含义是什么 文件是 cpp和 h 新添加的两个文件的图标显示正确 如下所示 但现有文件都变成了多黄色文档 为什么它替换了图标对于文件类型 图标最初加载正确 但在分析后似乎发生了变化
  • Codeigniter 文件路径

    抱歉打扰 但我对 codeigniter 中的文件路径有些困惑 因为您可能知道也可能不知道 CI 的文件系统布局如下 application controllers views models system contains CI frame
  • 从本地 apache 服务器发送邮件

    我想从我的 PHP Web 应用程序发送电子邮件 我知道这是可能的 因为几个月前 我的系统上有这个 功能 然后我开始使用 xampp 并且该功能消失了 我想 当我回到本地服务器并使用本地 MySQL 数据库和像以前一样的东西时 我可以再次从
  • phpexcel在单元格范围上设置数据类型

    With PHPExcel http phpexcel codeplex com 我在用着 workSheet gt fromArray array 设置我的数据 但是 需要将一列设置为字符串 带有前导零的数字 如果不设置为字符串 前导零将
  • PHP DOMDocument loadHTML 未正确编码 UTF-8

    我正在尝试使用 DOMDocument 解析一些 HTML 但是当我这样做时 我突然丢失了我的编码 至少在我看来是这样 profile div p various japanese characters p div dom new DOMD
  • VBA (Excel) ActiveX 列表框更改事件递归行为

    我不是 VBA 程序员 因此如果我在这个问题中的某些术语不正确 我提前道歉 我的一位同事希望在选择列表框后立即清除该选择 经过一番谷歌搜索后 我们发现一种方法是通过 Change 事件 最初我们尝试过 Private Sub ListBox
  • 如何在 NSMutableArray 中存储 CGRect 值?

    我如何将 CGRect 对象存储在 NSMutableArray 中 然后再检索它们 你需要将 CG 结构包裹在NSValue类 所以 NSMutableArray array NSMutableArray mutableArray arr
  • ggplot barplot 中 y 轴的顺序错误

    在此条形图中 条形图的缩放方式不同 因此 y 轴的排序不正确 157 gt 1342 6 我该如何解决 library reshape library ggplot2 data lt matrix 1 9 3 3 colnames data
  • Protobuf 编译问题

    我一直在尝试运行 TensorFlow 库 为此我必须编译 Protobuf 库 我正在使用以下命令 C tensorflow master tensorflow models gt protoc object detection prot
  • 如何让J2ME应用程序在后台运行?

    我编写了一个 J2ME 应用程序 它使用蓝牙并在对等移动设备中搜索文件并下载它 我想让我的应用程序在后台运行 每当我接到电话或消息并在几秒钟后恢复时 有人从事过这方面的工作吗请分享您的经验 有什么办法可以在后台运行 Midlet 吗 要将
  • 如何将对嵌套类成员的访问限制为封闭类?

    是否可以指定嵌套类的成员可以由封闭类访问 但不能由其他类访问 这是问题的说明 当然我的实际代码有点复杂 public class Journal public class JournalEntry public JournalEntry o
  • 使用 OpenOffice 3 示例代码的“Hello World”

    我正在尝试使用 WinXP MSVC 2008 NET 编写一个简单的 Hello World 窗口开发办公室 http en wikipedia org wiki OpenOffice org3 0 API和SDK 这篇文章对于初学者来说
  • Clojure clojure.core.reducers/fold 和 Scala Fold 有什么区别?

    我发现 Clojure 有clojure core reducers fold功能 Scala 还内置了fold功能但无法理解它们的工作方式是否不同 我假设你正在谈论clojure core reducers fold https cloj