2

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

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

有没有办法获得相同的教育,而无需支付成本concat,从而创建一个中间惰性序列?

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

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

2 回答 2

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)或相似。

这种方法确实加快了我所做的一些实验,虽然不是你的具体例子。

于 2018-03-02T09:53:38.837 回答
0

您也可以在没有减速器的情况下执行此操作,只需使用内置cat传感器

(eduction (comp cat (map inc)) [[1 2] [3 4]])
;; => (2 3 4 5)
于 2018-12-09T07:47:54.840 回答