【发布时间】:2011-03-17 09:52:46
【问题描述】:
我第一次在我正在编写的 Haskell 程序中遇到无限循环。我已将其缩小到一个非常具体的代码部分,但我似乎无法准确指出我在哪里有一个非终止递归定义。我对 GHCi 中的 :trace 和 :history 有点熟悉,但问题是我的代码的某些分支涉及到 Data.Map.Map 的大量递归修改,因为地图 x 是由 @987654323 获得的@ing 在地图x' 中的某些东西基于另一个地图中的值,这取决于x'。细节在这里并不重要,但正如您可能知道的那样,如果这种情况以交织的递归方式发生,我的通话记录将完全陷入地图lookups、adjustments 和 @ 中涉及的所有各种比较中987654328@ions.
谁能推荐一种更有效的方法来定位无限循环?例如,将调用历史限制为来自单个源文件的调用会很有帮助。
【问题讨论】:
-
已经破解了好几行 Haskell,我不得不说我在调试方面从来没有太多运气。始终彻底修改代码和重构最终帮助我找到了问题所在。但当然,这只是轶事。
-
如果您发布一些代码,社区可能会帮助您调试它。
-
@FUZxxl:是的,这确实是一个很好的调试策略。它帮助了我很多次。我已经能够通过在纸上评估我的表达式来解决我的特定问题,直到我可以看到无限递归的定义。但是,我仍然想了解更多关于不同调试技术的信息,所以我将留下这个问题。
标签: debugging haskell infinite-loop ghc ghci