小编drR*_*rtz的帖子

Transducers:如果嵌套步骤数量返回减少,那么完成数量应该做什么?

有状态转换器预计会在调用“完整”元数(即[([result input] ))之前根据需要多次调用“步骤”元数(即([result] ))来刷新其状态。

\n

我的问题是reduced这里如何处理提前终止(使用 )。

\n

https://clojure.org/reference/transducers#_early_termination \nit 说

\n
\n

在完成步骤中,具有缩减状态的传感器应在调用嵌套的 Transformer\xe2\x80\x99s 完成函数之前刷新状态,除非它之前已经看到来自嵌套步骤的缩减值,在这种情况下,应丢弃挂起状态。

\n
\n

但“以前见过”是什么意思?

\n

对上述引用有三种可能的解释:\n如果嵌套转换器的“步骤”数量已返回一个reduced值,则“完整”步骤应该

\n
    \n
  1. 仍然通过调用嵌套的“step”数量来刷新状态,
  2. \n
  3. 忽略它的状态并只调用“完整”元数,或者
  4. \n
  5. 根本不调用嵌套变压器的任何数量
  6. \n
\n

看看partition-by它的实现,似乎第一个选项适用:

\n
   ([result]\n           (let [result (if (.isEmpty a)\n                          result\n                          (let [v (vec (.toArray a))]\n                            ;;clear first!\n                            (.clear a)\n                            (unreduced (rf result v))))]\n             (rf result)))\n
Run Code Online (Sandbox Code Playgroud)\n

在将此未减少的值传递给嵌套变换的“完整”数量之前,这还会从使用剩余状态调用嵌套变换的“步骤”数量的结果中删除“减少”。

\n

那么问题是,如果我有一个有状态的减速器,在其完成步骤中会多次调用其嵌套转换的“步骤”数量,那么如果它在reduced完成步骤中看到一个值,它应该如何反应?

\n

尝试将上面的引用和代码结合起来,我认为它应该停止调用“step”arity并直接调用具有unreduced类似值的“complete”arity partition-by

\n

但是,然后查看代码cat …

clojure transducer

8
推荐指数
0
解决办法
167
查看次数

标签 统计

clojure ×1

transducer ×1