Clojure中的可折叠收藏是什么?

Clojure中的可折叠收藏是什么?,clojure,reducers,Clojure,Reducers,我是Clojure的初学者,在尝试阅读有关Clojure的文章时,我发现了一种叫做折叠收藏的东西 他们提到向量和地图是可折叠的集合,但不是列表 我试图理解什么是可折叠集合,为什么向量和地图是可折叠的 我没有找到任何关于可折叠收藏的定义或解释。答案在文档中,如果不是很清楚的话: 此外,还提供了一些集合(持久向量和映射) 可折叠的。减速器上的折叠操作执行减速 平行的 其思想是,使用现代硬件,可以并行地进行“归约”操作,如对向量的所有元素求和。例如,如果对一个400K长度向量的所有元素求和,我们可以将

我是Clojure的初学者,在尝试阅读有关Clojure的文章时,我发现了一种叫做折叠收藏的东西

他们提到向量和地图是可折叠的集合,但不是列表

我试图理解什么是可折叠集合,为什么向量和地图是可折叠的


我没有找到任何关于可折叠收藏的定义或解释。

答案在文档中,如果不是很清楚的话:

此外,还提供了一些集合(持久向量和映射) 可折叠的。减速器上的折叠操作执行减速 平行的

其思想是,使用现代硬件,可以并行地进行“归约”操作,如对向量的所有元素求和。例如,如果对一个400K长度向量的所有元素求和,我们可以将它们分成4组100K块,并行求和,然后将4个小计合并到最终答案中。这将比仅使用单线程(单cpu核心)快大约4倍

reducer位于
clojure.core.reducer
名称空间中。假设我们定义的别名如下:

( ns demo.xyz
  (:require [clojure.core :as core]
            [clojure.core.reducers :as r] ))
与clojure.core相比,我们有:

core/reduce   <=>   r/fold     ; new  name for `reduce`
core/map      <=>   r/map      ; same name for `map`
core/filter   <=>   r/filter   ; same name for `filter`
(时间(r/折叠+数据))

标准报告:

reduce   144 ms
r/fold    72 ms

更新#2

Rich Hickey谈到了传感器/减速器的设计。你可能会发现这些细节很有用。基本思想是将折叠委托给每个集合类型,该集合类型使用其实现细节的知识来高效地执行折叠


由于散列映射在内部使用向量,因此它们可以有效地并行折叠。

盖伊·斯蒂尔(Guy Steele)的这篇演讲早于还原子,可能只是为它们提供了灵感。

我理解了什么是折叠,我的疑问是什么是折叠收藏?hashmap是否也是随机访问数据结构?是否有可折叠集合的简单定义?技术答案是满足谓词
#(满足?r/CollFold%)
的任何值。不幸的是,这不起作用,因为
r/CollFold
被扩展到
对象
,任何值都是
对象
"Elapsed time: 61.67537 msecs"
"Elapsed time: 56.811961 msecs"
"Elapsed time: 55.613058 msecs"
"Elapsed time: 58.359599 msecs"
"Elapsed time: 55.299767 msecs"
"Elapsed time: 62.989939 msecs"
"Elapsed time: 56.518486 msecs"
"Elapsed time: 54.218251 msecs"
"Elapsed time: 54.438623 msecs"
reduce   144 ms
r/fold    72 ms