以下是我正在做的一个简单的版本:
(eduction (map inc) (concat [1 2] [3 4]))
; -> (2 3 4 5)
有没有办法获得相同的教育,而不必支付concat
的费用,这会产生一个中间懒惰的seq?
以下可能已经不那么令人讨厌了,因为我们只是有一个向量,而不是懒惰的seq,但我想知道是否可以避免这种情况。
(eduction (comp cat (map inc)) [[1 2] [3 4]])
答案 0 :(得分:4)
最简单的方法是单独处理您的收藏并合并结果。事实上,有一个简单的基于Reducer的解决方案,完全可以实现这一目标。
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)
或类似的方式将它们连接起来。
这种做法确实加快了我做过的一些实验,但不是你的具体例子。
答案 1 :(得分:0)
您也可以只使用内置的cat
换能器而无需减速器
(eduction (comp cat (map inc)) [[1 2] [3 4]])
;; => (2 3 4 5)