Haskell/GHCi或其他语言是否有“调试器语句”?

3

背景

我正在学习 GHCi 的 :break 功能。JS 有一个内置语句叫做 debugger;,如果正在进行调试,则充当断点;否则不起作用。

问题

在 Haskell/GHCi 中是否有类似的语句/函数?

进一步说明

我想到了类似于 Debug.Trace.trace :: String -> a -> a 的东西。

如果它在内部使用 unsafePerformIO,或者依赖于某些仅适用于 GHCi 的东西,那么这是可以接受的,因为它仅用于调试。

或者,如果还没有类似的功能,是否可以通过使用 :set -fbreak-on-exception 并编写一个抛出异常并立即捕获它的函数来实现类似的效果?(这里可能也需要使用 unsafePerformIO,以便将函数放置在纯代码中。)

2个回答

5

你不需要它。

代码清晰比充满调试插入更好。

使用ghci,你可以在任何地方按函数名称或行号设置断点。从ghci :help。

   :break [<mod>] <l> [<col>]  set a breakpoint at the specified location
   :break <name>               set a breakpoint on the specified function

替代方案:

更进一步,你可以在项目的基础上保留一个断点列表,使用./.ghci命令批处理文件,并在ghci启动时自动加载。


3
如果你真的想要这样做,你可以定义自己的身份函数。
debugger :: a -> a
debugger x = x

在GHCi中使用:break debugger命令可以设置断点。

这既不会让你访问调用函数的变量绑定,也不允许你回到调用函数,除非你之前在那里创建了另一个断点。我说得对吗? - Gabriel Riba
@GabrielRiba :trace:hist:back 看起来都能正常工作。 - chi

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