clojure - 使用 reduce 避免 clojure 中的 StackOverflowError

标签 clojure

简单的代码

(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/

相关文章:

java - 简单的 clojure java interop (swing) 程序不能完全让它工作

clojure - 为什么这个 clojure 宏需要 `' ~?

使用 lein uberjar 构建的 Clojure 应用无法启动

clojure - 在 Clojure 中,将惰性序列转换为其他类型时 apply 和 into 有什么区别?

java - 如何使用 Clojure 的 gen-class 创建多个 Java 成员变量

clojure - Clojure 的 memoize 是否会强制对其参数进行评估?

python - 什么叫做允许模拟浏览器以实现自动化的库?

vector - 获取映射向量中最大键的向量

clojure - 在 Paradise 中导入 Clojure 库时遇到问题

unit-testing - 如何对 clojure.core.async go 宏进行单元测试?