Debugging Haskell程序输出`<&书信电报;环路>&燃气轮机`

Debugging Haskell程序输出`<&书信电报;环路>&燃气轮机`,debugging,haskell,compilation,ghc,haskell-platform,Debugging,Haskell,Compilation,Ghc,Haskell Platform,我编写了一个Haskell程序,可以在列表上执行二进制搜索。至少我认为它是这样的。当我用ghc v7.6.3编译程序并运行该程序时,我得到了以下输出: progname: <<loop>> progname: 这个输出究竟意味着什么?这是否意味着我有一个无限循环,ghc优化了?我应该如何调试它?正如一些评论所说,这是Haskell RTS在运行时检测无限循环。它可以,但在简单的情况下它可以 比如说, x = x + 1 将很好地编译,但会在运行时引发异常。(顺便说一

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

progname: <<loop>>
progname:

这个输出究竟意味着什么?这是否意味着我有一个无限循环,
ghc
优化了?我应该如何调试它?

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

比如说,

x = x + 1
将很好地编译,但会在运行时引发异常。(顺便说一句,这是一个例外——特别是,如果你愿意,你可以抓住它。但你可能不“想要”。)


那么GHC为什么还要让它编译呢?好吧,因为如果我将
+
替换为,比如说,
,那么表达式现在可以很好地终止。(它表示一个1元素循环列表。)编译器在编译时无法判断什么是和什么是不合理的递归。RTS不能总是在运行时判断;但是,当它可以判断出某些错误时,它会向您抛出异常,让您知道。

您知道ghci调试器吗?您还可以重新使用HPC来找出哪些代码没有被执行,以此来缩小循环。@ThomasM.DuBuisson GHCI引发:
异常:
。我假设编译后的输出
progname:
是和STDERR消息。这是否意味着我有一个无限循环?是的,是RTS(运行时系统)检测到一个无限循环(在某些情况下可以这样做)。特别是当它检测到计算特定构造函数时产生的无限循环时,需要计算该构造函数。@awashburn您可以拥有完全定义的自引用值<例如,代码>fibs=0:scanl(+)1 fibs。这就是为什么它是被允许的。有没有办法强迫Haskell也输出它找到的无限循环?@Bakuriu遗憾的是没有。你能做的最好的事情就是尝试捕捉异常并打印出从哪里捕捉到的,但这需要你首先知道从哪里开始寻找。通常,循环错误与键入错误一样愚蠢(例如,您的意思是
x=fooy
,但意外地编写了
x=foox
)。@Bakuriu如果您在启用评测的情况下编译,以下内容将告诉您引发异常的位置:
/progName+RTS-xc-RTS
@MathematicalOrchid您可以添加示例(x=foox)你的答案是什么?我知道这是一个老问题,但我刚从谷歌发过来,也有同样的错误,这是一个很简单的问题,就像你说的。这可能会给像我这样的哈斯凯尔人带来价值(评论也不是永远的)。