リストでバイナリ検索を実行するHaskellプログラムを作成しました。少なくともそれは私が思ったことです。 ghc v7.6.3
を使用してプログラムをコンパイルし、プログラムを実行すると、次の出力が得られました。
progname: <<loop>>
この出力は一体どういう意味ですか? ghc
が最適化された無限ループがあったということですか?これをどのようにデバッグする必要がありますか?
コメントのいくつかが言っているように、これは実行時に無限ループを検出するHaskellRTSです。 常にそのようなループを検出することはできません ですが、単純なケースでは可能です。
例えば、
x = x + 1
正常にコンパイルされますが、実行時に例外が発生します。 (ちなみに、これは例外です-特に、catch必要に応じて。しかし、おそらく「したくない」でしょう。)
では、なぜGHCはこれをコンパイルさせるのでしょうか? +
をたとえば:
に置き換えると、式は正常に終了するようになりました。 (これは1要素の循環リストを表します。)コンパイラーは、コンパイル時に、意味のある再帰であるかどうかを判断できません。 RTSは、実行時に常に通知できるとは限りません。ただし、canで問題が発生した場合は、例外をスローして通知します。