Haskell程序输出`&lt; <loop>&gt;`</loop>

时间:2014-02-01 23:45:02

标签: debugging haskell compilation ghc haskell-platform

我写了一个Haskell程序,它在列表上执行二进制搜索。至少这就是我的想法。当我使用ghc v7.6.3编译程序并运行程序时,我得到了以下输出:

progname: <<loop>>

这个输出究竟是什么意思?这是否意味着我有一个ghc优化掉的无限循环?我该怎么调试呢?

1 个答案:

答案 0 :(得分:26)

正如其中一些评论所说,这是Haskell RTS在运行时检测到无限循环。它cannot always detect such loops,但在简单的情况下它可以。

例如,

x = x + 1

编译得很好,但在运行时会引发异常。 (顺便提一下,这是一个异常 - 特别是,如果你愿意,你可以捕捉它。但你可能并不“想要”。)

那么为什么GHC甚至让这个编译?好吧,因为如果我用+替换:,那么表达式现在终止就好了。 (它表示一个1元素的循环列表。)编译器无法在编译时告诉什么是合理的递归而不是合理的递归。 RTS不能总是在运行时告诉;但当它可以告诉某些错误时,它会通过向你抛出异常来告诉你。