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

Is there a way to set a breakpoint at a multiline function defined in a let block in ghci?

使用 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.

我也可以在 g 的 let 语句处中断,使用 :break 3;但是,我想绑定调用 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

当你到达那个断点时,只做一步。