Haskell程序输出`<< loop >>`

rec*_*nja 27 debugging haskell compilation ghc haskell-platform

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

progname: <<loop>>
Run Code Online (Sandbox Code Playgroud)

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

Mat*_*hid 28

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

例如,

x = x + 1
Run Code Online (Sandbox Code Playgroud)

编译得很好,但在运行时会引发异常.(顺便说一下,这是一个例外 - 特别是,如果你愿意,你可以抓住它.但你可能不"想要".)

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

  • 有没有办法强迫Haskell输出*它发现的*无限循环? (5认同)
  • @Bakuriu如果你在启用了性能分析的情况下编译,下面将告诉你抛出异常的位置:`./progName + RTS -xc -RTS` (4认同)
  • @Bakuriu可悲的是没有.关于你能做的最好的事情是尝试捕捉异常并打印出你从哪里抓到它 - 但这需要你知道从哪里开始寻找它.通常循环错误就像拼写错误一样愚蠢(例如,你的意思是`x = foo y`但是偶然写了`x = foo x`). (2认同)