Программа Haskell выводит `<< цикл >>`

Я написал программу Haskell, которая формирует двоичный поиск в списке. По крайней мере, это то, что я думал. Когда я скомпилировал программу с помощью ghc v7.6.3 и запустил программу, я получил следующий вывод:

progname: <<loop>>

Что означает этот выход? Означает ли это, что у меня был бесконечный цикл, который ghc оптимизировался? Как я должен отлаживать это?

Ответ 1

Как уже отмечалось в нескольких комментариях, это Haskell RTS обнаруживает бесконечный цикл во время выполнения. Это не всегда может обнаружить такие циклы, но в простых случаях это возможно.

Например,

x = x + 1

будет компилироваться просто отлично, но вызывать исключение во время выполнения. (Кстати, это исключение - в частности, вы можете поймать его, если хотите. Но вы, вероятно, "не хотите".)

Итак, почему GHC даже разрешает эту компиляцию? Ну, потому что, если я заменил + на, скажем, :, тогда выражение теперь заканчивается просто отлично. (Он представляет собой 1-элементный круговой список.) Компилятор не может сказать во время компиляции, что есть и не является разумной рекурсией. RTS не всегда может указывать во время выполнения; но когда он может сказать что-то не так, это даст вам знать, бросив на вас исключение.