简单的代码
(reduce concat (take 10000 (repeat '(1))))
导致StackOverflowError。假设我有一个很大的列表列表,就像我在这个例子中用take
获得的列表一样。如何尝试将它们合并到一个列表中?
答案 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])))
似乎更清楚。