Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Clojure 我是否可以在不进行编码的情况下转换/导出多个集合_Clojure_Transducer - Fatal编程技术网

Clojure 我是否可以在不进行编码的情况下转换/导出多个集合

Clojure 我是否可以在不进行编码的情况下转换/导出多个集合,clojure,transducer,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]]) 单独处理集合并合并结果可能是最简单的方法。事实上,有

下面是我正在做的事情的基本版本:

(eduction (map inc) (concat [1 2] [3 4]))
; -> (2 3 4 5)
有没有一种方法可以获得同样的教育,而不必支付concat的费用,这就产生了一个中间的懒惰seq

下面的内容可能已经少了一点浪费,因为我们没有懒惰的seq,我们只有一个向量,但我想知道这是否可以避免

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

单独处理集合并合并结果可能是最简单的方法。事实上,有一个简单的基于还原剂的解决方案,可以在幕后实现这一点

clojure.core.reducers命名空间有一个fold的组合函数,您可以重新利用它来构造向量的可还原串联

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

(eduction (map inc) (r/cat [1 2] [3 4]))
;; => (2 3 4 5)
这避免了concat中使用的惰性序列。如果有两个以上的向量,可以使用reduce r/cat[]coll或类似的方法将它们连接起来


这种方法确实加快了我所做的一些实验,尽管不是您的特定示例。

您也可以在不使用减速器的情况下,仅使用内置的cat传感器进行此操作

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

使用concat的lazy seq解决方案的成本几乎为零,因此我不确定您为什么不这样做?@AlanThompson not=几乎为零在某些情况下,您需要从代码中挤出最后一点性能。我正处于这样一种情况,在这种情况下,代码处于热路径。而且,我只是好奇。虽然在我看来,转换器主要是关于干代码和反编译代码,但它们的另一个方面是优越的性能。我倾向于同意@AlanThompson的观点。如果你找到了一个性能更好的解决方案,你能用比较两者的时间来编辑你的帖子吗?这表明分块的惰性序列通常足够快,而可还原性提供的性能“改进”可能根本不存在。测量谢谢glts。我还针对小型和大型输入集合对此进行了计时,结果是性能方面的问题无关紧要。知道这个函数在core中仍然很有趣……如果你把我的问题读到最后,你会在里面找到你的建议——逐字逐句。