1
forever
を見る:「永遠に」例外を投げる?
λ: import Control.Monad
λ: :t forever
forever :: Monad m => m a -> m b
はなぜforever $ Just 42
は、数秒後に例外をスローしますか?
λ: forever $ Just 42
*** Exception: <<loop>>
forever $ return 4
(少なくとも数秒後)?
λ: forever $ return 4
^C^C^C^Z
[1]+ Stopped ghci
意味が分かります。意味的には、例外と無限ループは区別できません。両方が下位の表記であるためです。意味的には、 'forever(return 0):: Maybe()'と 'forever(return 0):: IO()'の間には*相違がありません。 –
GHCは、「グレイホール」と呼ばれるものを使用して、並行コンテキストで遅延値を処理します。大量のコードを複製するのを避けるため、シングルスレッドのランタイムでもそれらを使用します。デバッグの目的で、「ブラックホール」に変形され、無限ループになることがあります。それはまさに正しい無限ループでなければならず、保証されていません。 – dfeuer