我可以转换/引导多个集合而无需将它们连接起来

时间:2018-03-02 01:09:35

标签: clojure transducer

以下是我正在做的一个简单的版本:

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

有没有办法获得相同的教育,而不必支付concat的费用,这会产生一个中间懒惰的seq?

以下可能已经不那么令人讨厌了,因为我们只是有一个向量,而不是懒惰的seq,但我想知道是否可以避免这种情况。

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

2 个答案:

答案 0 :(得分:4)

最简单的方法是单独处理您的收藏并合并结果。事实上,有一个简单的基于Reducer的解决方案,完全可以实现这一目标。

clojure.core.reducers命名空间有catfold的组合函数,您可以重新调整用来构建向量的可简化连接。

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

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

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

这种做法确实加快了我做过的一些实验,但不是你的具体例子。

答案 1 :(得分:0)

您也可以只使用内置的cat换能器而无需减速器

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