我需要main在Haskell中使用循环.我试过这个:
main :: IO ()
main =
do
putStrLn "do something"
main
Run Code Online (Sandbox Code Playgroud)
上面的代码是正确的方法吗?这种无限递归会导致溢出吗?
ehi*_*ird 38
这可以; 不会发生堆栈溢出.Haskell中的堆栈溢出(实际上,任何非严格的语言)与其他语言中的堆栈溢出不同; 它们是在没有评估它们的情况下积累大量价值而产生的,但你们并没有在这里积累任何东西; 只是排序一系列无限的动作.您可以这样想:打印线后,操作被丢弃,控制直接进入main; 堆栈中没有任何东西,因为没有什么必须返回.
这就是你可以在不耗尽内存的情况下迭代无限列表的原因相同:当程序进一步向下列表时,垃圾收集器会回收先前的列表单元,因为它们不再需要.在这种情况下,之前的顺序被回收,因为没有理由保留您已执行的操作.
也就是说,编写这个特定示例的更好方法是:
import Control.Monad
main :: IO ()
main = forever $ putStrLn "do something"
Run Code Online (Sandbox Code Playgroud)
当然,如果您的循环有意终止,这将不起作用.forever它本身是用递归实现的,所以除了可读性之外没有任何好处.
| 归档时间: |
|
| 查看次数: |
4399 次 |
| 最近记录: |