簡體   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