我可以在不联系它们的情况下转换/减少多个集合吗

Can I transduce / educe over multiple collections without concatting them

下面是我正在做的事情的基本版本:

(eduction (map inc) (concat [1 2] [3 4]))
; -> (2 3 4 5)

有没有办法获得相同的 eduction,而不必支付 concat 的成本,这会创建一个中间惰性序列?

以下可能已经不那么浪费了,因为我们没有惰性序列,只有一个向量,但我想知道是否可以避免这种情况。

(eduction (comp cat (map inc)) [[1 2] [3 4]])

单独处理集合并合并结果可能是最简单的方法。事实上,有一个简单的 reducers-based 解决方案可以在幕后完成。

clojure.core.reducers 命名空间有 cat,一个 fold 的组合函数,您可以重新利用它来构建向量的可简化串联。

(require '[clojure.core.reducers :as r])

(eduction (map inc) (r/cat [1 2] [3 4]))
;; => (2 3 4 5)

这避免了 concat 中使用的延迟序列。如果你有两个以上的向量,你可以用 (reduce r/cat [] colls) 或类似的方法将它们全部连接起来。

这种方法确实加快了我所做的一些实验,尽管不是您的特定示例。

您也可以在没有减速机的情况下使用内置 cat 传感器

(eduction (comp cat (map inc)) [[1 2] [3 4]])
;; => (2 3 4 5)