dev*_*ium 6 haskell functional-programming tail-recursion ghci
我期待看到我的堆栈与以下代码打击..但它没有:
*Main> let blowwss x = if x == 0 then 0 else (1 + blowwss (x-1))
*Main> blowwss 1000000
1000000
Run Code Online (Sandbox Code Playgroud)
该函数似乎不是尾递归,所以我想知道我可能缺少什么.GHCi的堆栈是否比我想象的要大(我怎么能看到它的堆栈大小,顺便说一下?).它是否使用某种蹦床来克服这个问题?它是否足够智能将函数转换为迭代对应物?
谢谢
GHCi的堆栈比你想象的要大.IIRC,GHCi的默认堆栈大小为500M,而编译程序的默认堆栈大小目前为8M.您可以自己设置一个较小的限制,以查看堆栈溢出(或者您可以显着增加您的参数).
$ ghci +RTS -K1M
GHCi, version 7.6.3: http://www.haskell.org/ghc/ :? for help
Loading package ghc-prim ... linking ... done.
Loading package integer-gmp ... linking ... done.
Loading package base ... linking ... done.
Prelude> let blowwss x = if x == 0 then 0 else (1 + blowwss (x-1))
Prelude> blowwss 1000000
*** Exception: stack overflow
Run Code Online (Sandbox Code Playgroud)
请注意,GHC具有堆栈大小限制,纯粹是为了防止在最可能出现编程错误的情况下出现无限/意外深度循环.原则上,堆栈可以无限增长(当然,受系统内存约束).即使您指定了较大的堆栈大小,堆栈实际上也会开始变小,但可以增长到极限.目前有关于在未来版本的GHC中可能完全取消限制的讨论.
归档时间: |
|
查看次数: |
437 次 |
最近记录: |