开发者

Haskell foldl and stack overflow?

开发者 https://www.devze.com 2023-02-10 15:27 出处:网络
I read a posting claims foldl may occur stack overflow easily. And the posting sample code was: maximum 开发者_如何学Python[1..1000000]

I read a posting claims foldl may occur stack overflow easily. And the posting sample code was:

maximum 开发者_如何学Python[1..1000000]

The code doesn't overflown in my machine. However it can vary by environment. I increased number like this:

maximum [1..1000000000]

it caused hard disk swapping, so I have to stop evaluation. Sample code is not important. Is it really occur stack overflow? Or just an old days story?


Some points

  • Recursive function take stack space in each call, so deeply nested calls will cause overflows
  • Tail-recursive function can be optimized to iterations and therefore don't overflow
  • foldr is not tail-recursive
  • Lazy evaluation can prevent tail-recursive functions from being optimized
  • foldl is tail-recursive and lazy, so it can overflow
  • foldl' is tail-recursive and strict, so it's safe


Data.List.maximum is implemented using the lazy foldl1. There is a rule to use strictMaximum (implemented using the strict foldl1') if the list contains Int or Integer.

So, the following program compiled with optimisations does not cause a stack overflow:

main = print $ maximum [1..1000000000 ]

0

精彩评论

暂无评论...
验证码 换一张
取 消