web-dev-qa-db-ja.com

Haskellプログラムは `<<ループ>>`を出力します

リストでバイナリ検索を実行するHaskellプログラムを作成しました。少なくともそれは私が思ったことです。 ghc v7.6.3を使用してプログラムをコンパイルし、プログラムを実行すると、次の出力が得られました。

progname: <<loop>>

この出力は一体どういう意味ですか? ghcが最適化された無限ループがあったということですか?これをどのようにデバッグする必要がありますか?

29
recursion.ninja

コメントのいくつかが言っているように、これは実行時に無限ループを検出するHaskellRTSです。 常にそのようなループを検出することはできません ですが、単純なケースでは可能です。

例えば、

x = x + 1

正常にコンパイルされますが、実行時に例外が発生します。 (ちなみに、これは例外です-特に、catch必要に応じて。しかし、おそらく「したくない」でしょう。)

では、なぜGHCはこれをコンパイルさせるのでしょうか? +をたとえば:に置き換えると、式は正常に終了するようになりました。 (これは1要素の循環リストを表します。)コンパイラーは、コンパイル時に、意味のある再帰であるかどうかを判断できません。 RTSは、実行時に常に通知できるとは限りません。ただし、canで問題が発生した場合は、例外をスローして通知します。

28