简单的代码
(reduce concat (take 10000 (repeat '(1))))
导致 StackOverflowError。假设我有一个很大的列表列表,就像我在本例中使用 take
获得的列表一样。如何在尝试时将它们合并到一个列表中?
最佳答案
问题是 concat
返回惰性序列(并堆叠函数调用直到元素实现)。您可以通过实现串联集合来修复它:
(reduce (comp doall concat) (take 10000 (repeat '(1))))
但是真的很慢。
在你的情况下,我宁愿使用这样的东西:
(reduce into [] (take 10000 (repeat '(1))))
它会急切地将每个集合中的所有元素一一添加到结果向量中。
否则(如果 reduce
的使用不是为了某些特殊的额外目的)你可以这样做:
(apply concat (take 10000 (repeat '(1))))
这会导致对 concat
的一次调用,产生一个惰性序列
关于clojure - 使用 reduce 避免 clojure 中的 StackOverflowError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37304884/