我已经看到很多示例,其中main
调用一个辅助函数,该函数以递归方式调用自身,例如
main = loop
where
loop = do
putStrLn "I'm in a loop"
loop
我从未见过main
递归调用自己的情况,例如
main = do
putStrLn "I'm in a loop"
main
尽管它似乎运行良好,但让我想知道为什么我从未见过它。是否被认为是非习惯用语?它会改变编译后的程序吗?
答案 0 :(得分:14)
这很好,但是很少重复执行程序的每个部分是很不常见的。通常,您需要进行一次一次性设置或其他一些设置,然后进入循环执行剩余部分;或者在主循环完成后需要做一些清理工作。在这种情况下,您无法再次调用main
,因为它将每次都进行一次设置(或清除)。如果您没有一次性设置,请随时main
对其进行呼叫。
答案 1 :(得分:2)
由于上次调用优化在Haskell中是常事,所以没问题。 Learn You A Haskell包含一些使用这种递归的示例。另外,此StackOverflow's post对该主题进行了更深入的研究。