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

atr*_*eju 5 haskell ghci

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

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

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

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

1 f x =
2     let g x' y =
3         let -- ...
4         in -- ...
5     in -- ...
Run Code Online (Sandbox Code Playgroud)

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

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

Nou*_*are 3

在 GHC 9.0.1 中添加了一项功能,允许您中断嵌套函数。请参阅GHC 9.0.1 用户指南。例如:

> :break f.g
Run Code Online (Sandbox Code Playgroud)

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

debugBreak = True

f x =
    let g x' y | debugBreak =
        let -- ...
        in -- ...
    in -- ...
Run Code Online (Sandbox Code Playgroud)

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

> :break debugBreak
Run Code Online (Sandbox Code Playgroud)

当遇到断点时,只需执行一个步骤即可。