下面是我正在做的一个简单的版本:
(eduction (map inc) (concat [1 2] [3 4]))
; -> (2 3 4 5)
有没有办法获得相同的教育,而无需支付成本concat
,从而创建一个中间惰性序列?
以下可能已经少了一点浪费,因为我们只有一个向量,而不是惰性序列,但我想知道是否可以避免这种情况。
(eduction (comp cat (map inc)) [[1 2] [3 4]])
下面是我正在做的一个简单的版本:
(eduction (map inc) (concat [1 2] [3 4]))
; -> (2 3 4 5)
有没有办法获得相同的教育,而无需支付成本concat
,从而创建一个中间惰性序列?
以下可能已经少了一点浪费,因为我们只有一个向量,而不是惰性序列,但我想知道是否可以避免这种情况。
(eduction (comp cat (map inc)) [[1 2] [3 4]])
单独处理您的集合并合并结果可能是最简单的。事实上,有一个简单的基于减速器的解决方案可以在幕后做到这一点。
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)