繁体   English   中英

在Haskell中使用什么而不是主循环?

[英]What to use instead of a main loop in Haskell?

我在Haskell中需要一个main循环。 我试过这个:

main :: IO ()
main =
  do
    putStrLn "do something"
    main

上面的代码是正确的方法吗? 这种无限递归会导致溢出吗?

这可以; 不会发生堆栈溢出。 Haskell中的堆栈溢出(实际上,任何非严格的语言)与其他语言中的堆栈溢出不同; 它们是在没有评估它们的情况下积累大量价值而产生的,但你们并没有在这里积累任何东西; 只是排序一系列无限的动作。 您可以这样想:打印线后,操作被丢弃,控制直接传递到main ; 没有任何东西保留在堆栈上,因为没有什么必须返回。

这就是你可以在不耗尽内存的情况下迭代无限列表的原因相同:当程序进一步向下列表时,垃圾收集器会回收先前的列表单元格,因为它们不再需要。 在这种情况下,之前的顺序被回收,因为没有理由保留您已执行的操作。

也就是说,编写这个特定示例的更好方法是:

import Control.Monad

main :: IO ()
main = forever $ putStrLn "do something"

当然,如果您的循环有意终止,这将不起作用。 forever本身就是用递归来实现的,所以除了可读性之外没有任何好处。

您观察到的是“尾调用消除/优化”的结果,这对Haskell来说并不特别。 参见例如http://en.wikipedia.org/wiki/Tail_call

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM