使用reduce

时间:2016-05-18 16:09:07

标签: clojure

简单的代码

(reduce concat (take 10000 (repeat '(1))))

导致StackOverflowError。假设我有一个很大的列表列表,就像我在这个例子中用take获得的列表一样。如何尝试将它们合并到一个列表中?

2 个答案:

答案 0 :(得分:7)

问题是concat返回一个惰性seq(并将函数调用堆叠起来,直到元素实现)。您可以通过实现连接集合来修复它:

(reduce (comp doall concat) (take 10000 (repeat '(1))))

但它确实很慢。

在你的情况下,我宁愿使用这样的东西:

(reduce into [] (take 10000 (repeat '(1))))

它会急切地将每个集合中的所有元素逐一添加到生成的向量中。

否则(如果reduce用法不是出于某些特殊的额外目的)你可以这样做:

(apply concat (take 10000 (repeat '(1))))

导致concat的单个调用,产生一个懒惰的序列

答案 1 :(得分:0)

如果(take 10000 (repeat 1))无效,因为你想要重复的内容已经出现在一堆seq或列表中,那么你也可以考虑这个。

(flatten (take 10000 (repeat [1])))

似乎更清楚。