Haskell foldl and stack overflow?

我与影子孤独终老i 提交于 2019-12-05 14:33:23

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 ]

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!