我写了一个Haskell程序,在列表上执行二分搜索。至少我以为它是这样。当我用ghc v7.6.3
编译并运行程序时,我得到了以下输出:
progname: <<loop>>
这个输出到底是什么意思?是说我有一个无限循环,被 ghc
优化掉了吗?我该如何调试?
我写了一个Haskell程序,在列表上执行二分搜索。至少我以为它是这样。当我用ghc v7.6.3
编译并运行程序时,我得到了以下输出:
progname: <<loop>>
这个输出到底是什么意思?是说我有一个无限循环,被 ghc
优化掉了吗?我该如何调试?
正如一些评论所说,这是Haskell RTS在运行时检测到无限循环。它不能总是检测到这些循环,但在简单的情况下可以。
例如:
x = x + 1
这段代码在编译时没有问题,但在运行时会引发异常。顺便提一下,这是一个异常, 特别的,如果你想的话,可以捕获它。但你可能不想这样做。
那么为什么GHC会允许编译这段代码呢?好吧,因为如果我将+
替换为:
,那么表达式现在就可以正常终止了。(它表示一个包含1个元素的循环列表。)编译器无法在编译时判断哪些递归是合理的,哪些不是。RTS并非总能在运行时判断,但当它能够判断出有问题时,它会通过抛出异常来告诉你。
x = foo y
但不小心写成了 x = foo x
)。 - MathematicalOrchid./progName +RTS -xc -RTS
。@Bakuriu - recursion.ninja
Exception: <<loop>>
。我猜编译输出的progname: <<loop>>
是一个 STDERR 信息。这是否意味着我的程序陷入了无限循环? - recursion.ninjafibs = 0:scanl(+)1 fibs
。 这就是为什么允许这样做的原因。 - Carl