在Clojure中完成函数的功能是什么?

时间:2017-06-07 21:41:10

标签: clojure transducer

我在clojuredocs上遇到completing函数,但目前没有文档。

你能提供一些例子吗?

1 个答案:

答案 0 :(得分:12)

completing用于扩充二进制缩减函数,该函数可能没有一元“完成”的一元重载。

The official transducers reference page托管@ clojure.org解释了转换函数的nullary,一元和二元重载的目的,并且包含了一个很好的例子,说明一元“完成”arity在“创建”一节中是否有用“传感器”(使用的示例是partition-all,它使用完成来产生最后的输出块)。

简而言之,在所有输入被消耗之后使用完成arity并且使转换函数有机会执行任何工作以清除转换过程可能维持的任何缓冲区(如partition-all的情况),将任何最终转换应用于输出(参见下面的示例)等。这里的“转换函数”我的意思是转换函数实际传递给transduce(或eduction或任何类似的函数设置与所有包裹换能器一起进行换能过程。

有关completing与非平凡完成函数一起使用的有趣示例,请查看Christophe Grand的xformsnet.cgrand.xforms.rfs/strtransduce - 友好版本的clojure.core/strtransduce调用中使用时将以线性时间构建字符串。 (相反,clojure.core/str,如果在reduce / transduce中使用,将在每一步创建一个新字符串,并因此在O(n²)时间内运行。 1 )它使用completing将它使用的StringBuilder转换为一个字符串,一旦它消耗了所有输入。 Here's a stable link to its definition as of the current tip of the master branch.

1 但是,请注意clojure.core/str如果与apply一起使用,则会以线性时间运行 - 它在StringBuilder下使用了net.cgrand.xforms.rfs/str }}。有时候transduce - 友好版本(用于传感器,或者在高阶上下文中使用,或者出于性能原因处理大量集合时可以比循环first使用的next / str