我在clojuredocscompleting
上遇到过功能,但目前没有文档。
你能提供一些例子吗?
completing
用于扩充可能没有具有一元“完成”元数的一元重载的二元归约函数。
托管在@ clojure.org的官方转换器参考页面解释了转换函数的零元、一元和二元重载的目的,并包括一个很好的例子,说明一元“完成”arity 在“创建转换器”一节中何时有用(示例used 是partition-all
使用完成来产生最终的输出块)。
简而言之,在消耗完所有输入后使用完成数量,并让转换函数有机会执行任何工作以刷新转换过程可能维护的任何缓冲区(如partition-all
),将任何最终转换应用于输出(请参阅下面的示例)等。这里的“转换函数”是指实际传递给transduce
(或eduction
设置转换过程的任何类似函数)的转换函数以及所有包装转换器。
completing
有关与非平凡完成函数一起使用的有趣示例,请查看 Christophe Grand 的xforms :net.cgrand.xforms.rfs/str
是一个transduce
友好的版本,当在调用clojure.core/str
中使用时,它将在线性时间内建立一个字符串。transduce
(相比之下,clojure.core/str
如果在reduce
/中使用transduce
,将在每一步创建一个新字符串,因此在 O(n²) 时间内运行。1)一旦它消耗所有输入,它就会将它使用的引擎转换为completing
字符串StringBuilder
. 这是从主分支的当前提示到其定义的稳定链接。
1但是,请注意,clojure.core/str
如果与 一起使用,它会在线性时间内运行apply
——它StringBuilder
在引擎盖下使用 a,就像net.cgrand.xforms.rfs/str
. 不时拥有一个transduce
友好的版本仍然很方便(用于转换器,或在高阶上下文中,或者在处理可以比使用的通过first
/next
循环有效地减少的大型集合时可能出于性能原因str
) .