在外行的术语中解释`core.reducers`库

时间:2014-09-05 08:02:10

标签: clojure

我目前正在学习clojure以获得乐趣,今天我遇到了这个article about reducers。我发现它不仅有趣而且对我来说很棘手。作为初学者:

  1. 我知道如何使用核心mapfilterreduce

  2. 我理解core/mapcore/filter ...返回sequable col

  3. Rich Hickey提到core.reducers/map ...返回reducible col

  4. 因为core/map ...和core.reducers/map的实现看起来非常相同。我的问题是

    1. reducible如何改变外行人的任期?

    2. 任何人都可以给我一些reducible函数的小例子吗?

    3. 非常感谢

1 个答案:

答案 0 :(得分:2)

对我来说,减速器的主要思想是它们实际上比map / filter / reduce 更少。 Reducers没有指定它们是懒惰还是急切地,串行或并行地对集合或其他类型的数据结构执行,并且它们生成的内容可能是集合或其他内容。例子:

  1. map / filter / reduce 必须通过集合并且必须生成 集合;减速机不必做任何一种。减速器的这个想法是 在transducers中扩展,以便相同的传感器可以应用于任何一个 一个集合或core.async频道。

  2. Reducers也没有指定如何执行它们。 map / filter / reduce始终以串行方式执行 采集;从不平行。如果你想跨越一个 并行收集,您必须使用不同的函数:pmap。您 可以想象,如果你想并行过滤,你可以 还创建一个函数pfilter(这不存在但你可以写它)。 Reducer简单地说,而不是创建每个函数的并行版本 “我不在乎我是如何被处决的”而且还取决于另一个功能(fold 在reducers的情况下)决定是否应该并行执行。 foldpmap更通用,因为它适用的减速器可以 做过滤或映射(或组合做两者)。

  3. 一般而言,因为减速机对适用于的内容,他们生产的内容如何应用做出的假设较少,他们更多灵活,因此可以在更广泛的情况下使用。这很有用,因为减速器专注于“你的程序做什么”而不是“它是如何做到的”。这意味着您的代码可以发展(例如,从单个线程到多线程甚至是分布式应用程序),而不必触及构成代码所用核心逻辑的程序部分。