But*_*840 6 stack-overflow haskell sum
我有以下代码.
main = print $ sum [1..1000000]
Run Code Online (Sandbox Code Playgroud)
当我运行时,我得到一个堆栈溢出:
Stack space overflow: current size 8388608 bytes.
Use `+RTS -Ksize -RTS' to increase it.
Run Code Online (Sandbox Code Playgroud)
我习惯于像Python那样的命令式语言,这些算法似乎没有问题:
sum(range(100000000)) # I'm not even using a generator.
4999999950000000
Run Code Online (Sandbox Code Playgroud)
Haskell显然是不同的,但我不太明白是什么导致堆栈溢出?在引擎盖下发生什么导致Haskell中的堆栈溢出?
lef*_*out 10
整个问题仅与GHC <7.10有关.在最近的版本中,sum [1..1000000]在恒定空间中工作得很好,至少在内置数字类型上.
sum 是曾经用邪恶的foldl1来实现,这不像它应该的那样严格.因此,你得到sum的本质上是一堆thunk,和你的输入一样大.我认为有一个讨论为什么它在某种程度上这样做... IMO它基本上只是愚蠢的,因为总和通常不能懒得消耗,因为使用严格的折叠是显而易见的.
Prelude>:m + Data.List
Prelude Data.List> foldl'(+)0 [
1..1000000 ] 500000500000
1实际上,foldl仅在报告版本中使用...但带累加器的显式递归版本当然不会更好.
| 归档时间: |
|
| 查看次数: |
487 次 |
| 最近记录: |