相关疑难解决方法(0)

为什么reduce在Clojure中给出了StackOverflowError?

我正在尝试连接一系列Seqs.

我可以做到apply concat.

user=> (count (apply concat (repeat 3000 (repeat 3000 true))))
9000000
Run Code Online (Sandbox Code Playgroud)

但是,根据我有限的知识,我会假设使用apply力量来实现懒惰的Seq,这对于非常大的输入来说似乎并不合适.如果可以的话,我宁愿懒洋洋地这样做.

所以我认为使用reduce就可以完成这项工作.

user=> (count (reduce concat (repeat 3000 (repeat 3000 true))))
Run Code Online (Sandbox Code Playgroud)

但这导致了

StackOverflowError   clojure.lang.RT.seq (RT.java:484)
Run Code Online (Sandbox Code Playgroud)

我很惊讶,因为我会认为语义reduce意味着它是尾调用的递归.

两个问题:

  • apply是最好的方法吗?
  • reduce一般不适合大投入?

stack-overflow recursion reduce clojure

23
推荐指数
1
解决办法
1543
查看次数

标签 统计

clojure ×1

recursion ×1

reduce ×1

stack-overflow ×1