我可以在不联系它们的情况下转换/减少多个集合吗
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)
下面是我正在做的事情的基本版本:
(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)