如何有效调试Haskell代码?

36

我曾使用过ghci调试器,但更希望它能与文本编辑器集成,以简化设置断点的流程。它应该至少简化查看局部状态的过程,而不是严格评估每个可见变量。

最近我发现了trace函数,它允许从通常难以调试的位置输出调试信息,对我很有帮助。


1
也许你已经阅读过了,但仅供参考:http://www.haskell.org/haskellwiki/Debugging - sastanin
4个回答

14
一个好的调试Haskell代码的方法是使用QuickCheckSmallCheck编写和测试代数定律。曾经有过几个Haskell调试器,包括Hat、Hood和Freya,但它们中没有一个被认为足够有价值而值得长期维护。
当涉及到Haskell时,你必须以不同的方式思考如何做事情。在QuickCheck页面上的ICFP论文有一些很好的例子可以帮助你入门。如果你想要一个实际的例子,xmonad就是使用QuickCheck进行广泛调试的。

1
快速检查链接出现403错误。(Oct. 05, 03:38:04 UTC)如果这不是暂时性错误,有人可以发布一个新链接吗? - John F. Miller
这里是更新后的QuickCheck链接(从www.cs变为www.cse):http://www.cse.chalmers.se/~rjmh/QuickCheck/ - SuperElectric
33
我可以尊敬地指出,调试和测试有区别。调试是找出错误的原因,而测试是寻找错误的存在。 - kristianp

9

是的,为GHCi调试器设计一个前端将是一件好事。也许我们可以在下一次Hackathon期间完成一些工作。但与此同时:

另外,Haskell非常适合使用QuickCheck进行自下而上的测试。即,单独测试组件,然后将它们组合在一起。如果你的代码是纯函数式的,这通常会非常顺利。


9
然而,通常问题就在于“将它们放在一起”。 - RnMss

6
作为一个附注,需要注意的是,在调试多线程程序时,Debug.trace 不会给你带来帮助。
从长远来看,测试是正确的方法。

3

根据我的经验,这与多种因素有关。

  1. 编写易于调试的功能代码,这意味着确保您的函数相对较小(5-20行),并且每个函数只执行一个明确定义的操作。
  2. 使用HUnit定义测试用例以找出问题。

正如其他答案中所述,许多人喜欢QuickCheck。我发现为我的某些代码定义有意义的QuickCheck测试用例比较困难,因此通常更多地使用标准单元测试。 话虽如此,在Real World Haskell的第11章中有一份优秀的介绍,介绍如何使用QuickCheck。

如果您发现自己同时使用QuickCheck和HUnit,则可以考虑使用test-framework


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接