我目前正在学习clojure
以获得乐趣,今天我遇到了这个article about reducers。我发现它不仅有趣而且对我来说很棘手。作为初学者:
我知道如何使用核心map
,filter
,reduce
我理解core/map
,core/filter
...返回sequable
col
Rich Hickey提到core.reducers/map
...返回reducible
col
因为core/map
...和core.reducers/map
的实现看起来非常相同。我的问题是
reducible
如何改变外行人的任期?
任何人都可以给我一些reducible
函数的小例子吗?
非常感谢
答案 0 :(得分:2)
对我来说,减速器的主要思想是它们实际上比map
/ filter
/ reduce
更少。 Reducers没有指定它们是懒惰还是急切地,串行或并行地对集合或其他类型的数据结构执行,并且它们生成的内容可能是集合或其他内容。例子:
map
/ filter
/ reduce
必须通过集合并且必须生成
集合强>;减速机不必做任何一种。减速器的这个想法是
在transducers中扩展,以便相同的传感器可以应用于任何一个
一个集合或core.async
频道。
Reducers也没有指定如何执行它们。
map
/ filter
/ reduce
始终以串行方式执行
采集;从不平行。如果你想跨越一个
并行收集,您必须使用不同的函数:pmap
。您
可以想象,如果你想并行过滤,你可以
还创建一个函数pfilter
(这不存在但你可以写它)。
Reducer简单地说,而不是创建每个函数的并行版本
“我不在乎我是如何被处决的”而且还取决于另一个功能(fold
在reducers的情况下)决定是否应该并行执行。
fold
比pmap
更通用,因为它适用的减速器可以
做过滤或映射(或组合做两者)。
一般而言,因为减速机对适用于的内容,他们生产的内容或如何应用做出的假设较少,他们更多灵活,因此可以在更广泛的情况下使用。这很有用,因为减速器专注于“你的程序做什么”而不是“它是如何做到的”。这意味着您的代码可以发展(例如,从单个线程到多线程甚至是分布式应用程序),而不必触及构成代码所用核心逻辑的程序部分。