我写了一个Haskell程序,它在列表上执行二进制搜索。至少这就是我的想法。当我使用ghc v7.6.3
编译程序并运行程序时,我得到了以下输出:
progname: <<loop>>
这个输出究竟是什么意思?这是否意味着我有一个ghc
优化掉的无限循环?我该怎么调试呢?
答案 0 :(得分:26)
正如其中一些评论所说,这是Haskell RTS在运行时检测到无限循环。它cannot always detect such loops,但在简单的情况下它可以。
例如,
x = x + 1
编译得很好,但在运行时会引发异常。 (顺便提一下,这是一个异常 - 特别是,如果你愿意,你可以捕捉它。但你可能并不“想要”。)
那么为什么GHC甚至让这个编译?好吧,因为如果我用+
替换:
,那么表达式现在终止就好了。 (它表示一个1元素的循环列表。)编译器无法在编译时告诉什么是合理的递归而不是合理的递归。 RTS不能总是在运行时告诉;但当它可以告诉某些错误时,它会通过向你抛出异常来告诉你。