我一直在使用 parsec,但在调试代码时遇到了麻烦。例如,我可以在 ghci 中设置断点,但我不确定如何查看消耗了多少输入,或者类似的东西。
是否有工具/指南可以帮助调试 parsec 代码?
最佳答案
This页面可能会有所帮助。Debug.trace
是你的 friend ,它允许你做一些 printf
调试。它计算并打印它的第一个参数,然后返回它的第二个。所以如果你有类似的东西
foo :: Show a => a -> a
foo = bar . quux
您可以通过更改
foo
来调试 foo 参数的“值”。到以下:import Debug.Trace(trace)
foo :: Show a => a -> a
foo x = bar $ quux $ trace ("x is: " ++ show x) x
foo 现在将像以前一样工作,但是当您调用
foo 1
时它现在将打印 x is: 1
评估时到标准错误。要进行更深入的调试,您需要使用 GHCI 的调试命令。具体来说,听起来您正在寻找
:force
命令,它强制评估变量并将其打印出来。 (替代方法是 :print
命令,它打印已评估的尽可能多的变量,不再评估。)请注意
:force
更有助于找出变量的内容,但也可能改变程序的语义(如果您的程序依赖于惰性)。一般的 GHCI 调试工作流程如下所示:
:break
设置断点:list
和 :show context
检查您在代码中的位置:show bindings
检查变量绑定(bind):print
查看当前绑定(bind)的内容:force
如有必要检查您的绑定(bind)如果您正在尝试调试无限循环,它也有助于使用
:set -fbreak-on-error
:trace myLoopingFunc x y
然后你可以打
Ctrl-C
在循环期间并使用 :history
看看有什么循环。
关于parsing - 秒级调试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9484065/