我正在学习clojure乐趣,今天我遇到了关于减速器的这篇文章.我发现它不仅有趣而且对我来说很棘手.作为初学者:
我知道如何使用核心map,filter,reduce
我理解core/map,core/filter...返回一个sequablecol
Rich Hickey提到core.reducers/map......返回reduciblecol
因为core/map...和core.reducers/map... 的实现看起来非常相同.我的问题是
reduciblecol 如何在外行的术语上有所作为?
任何人都可以给我一些琐碎的reducible功能例子吗?
非常感谢
对我来说,减速器的主要思想是它们实际上做的事情少于map// 。减速器不指定它们是延迟执行还是急切执行、串行执行还是并行执行、在集合上还是在另一种类型的数据结构上执行,以及它们生成的内容可能是集合或其他东西。例子:filterreduce
map//filter必须reduce 传递一个集合并且必须产生一个集合;减速器也不必这样做。减速器的这种想法在转换器中得到了扩展,以便同一个转换器可以应用于集合或通道core.async。
减速器也没有指定它们是如何执行的。
map//始终filter以reduce串行方式跨集合执行;永远不会并行。如果要跨集合并行执行,则必须使用不同的函数:pmap。您可以想象,如果您想并行过滤,您也可以创建一个函数pfilter(这不存在,但您可以编写它)。减速器不是为每个函数创建并行版本,而是简单地说“我不关心如何执行”,并且由另一个函数(fold
在减速器的情况下)来决定是否应该并行执行。
fold比它更通用,pmap因为它适用的减速器可以执行过滤或映射(或组合执行两者)。
一般来说,由于减速器对它们的应用范围、生产内容或应用方式做出的假设较少,因此它们更加灵活,因此可以用于更广泛的情况。这很有用,因为减速器关注的是“你的程序做了什么”而不是“它是如何做的”。这意味着您的代码可以发展(例如,从单线程到多线程,甚至到分布式应用程序),而不必触及程序中构成代码功能的核心逻辑的部分。