有没有办法在 ghci 的 let 块中定义的多行函数处设置断点?

问题描述

使用 ghci,如果我有类似的东西

1 g x y = 
2     let -- ...
3     in -- ... (recursively calls itself) 
3 
4 
5 f x = -- ... (calls g once)

我可以使用 :break g 在 g 处设置断点,调用 f,并在每次 g 被调用时让程序中断。

但是,我没有在其他任何地方使用 g,所以我想写

1 f x =
2     let g x' y =
3         let -- ...
4         in -- ...
5     in -- ...

有没有办法在每次调用 g 时中断?我注意到如果 g 是一行,我只能说 :break 2

我还可以使用 :break 3 在 g 的 let 语句处中断;但是,我想绑定调用 g 的参数,我认为这不允许我这样做。

解决方法

在 GHC 9.0.1 中添加了一项功能,允许您中断嵌套函数。见the GHC 9.0.1 user guide。例如:

> :break f.g

对于早期版本的 GHC,您或许可以添加一个特殊的调试变量:

debugBreak = True

f x =
    let g x' y | debugBreak =
        let -- ...
        in -- ...
    in -- ...

然后你可以像这样中断那个函数:

> :break debugBreak

当你到达那个断点时只需执行一个步骤。