Debugging 测试顶级函数中定义的内部函数并与之交互的最佳方法是什么?

Debugging 测试顶级函数中定义的内部函数并与之交互的最佳方法是什么?,debugging,haskell,read-eval-print-loop,ghci,Debugging,Haskell,Read Eval Print Loop,Ghci,当我用Javascript编程时,我发现能够使用调试器在任何时候停止程序执行,并且能够在那里运行命令和检查变量非常方便 现在,回到Haskell,有没有办法在交互式GHCI REPL中运行任意函数,或者我仅限于在顶层声明的内容 处理和调试内部函数和值的“标准”方法是什么?当您在GHCi中的断点处停止时,您可以访问范围内的任何内容。假设你有这样一个函数: foo :: Int -> Int foo x = g (x + 2) where g y = x^y 您可以在foo上设置断点并

当我用Javascript编程时,我发现能够使用调试器在任何时候停止程序执行,并且能够在那里运行命令和检查变量非常方便

现在,回到Haskell,有没有办法在交互式GHCI REPL中运行任意函数,或者我仅限于在顶层声明的内容


处理和调试内部函数和值的“标准”方法是什么?

当您在GHCi中的断点处停止时,您可以访问范围内的任何内容。假设你有这样一个函数:

foo :: Int -> Int
foo x = g (x + 2)
  where g y = x^y 
您可以在
foo
上设置断点并尝试调用它:

> :break foo
Breakpoint 1 activated at /tmp/Foo.hs:(2,1)-(3,17)
> foo 42
Stopped at /tmp/Foo.hs:(2,1)-(3,17)
_result :: Int = _
g
此时还不在范围内,因此我们必须执行一次步骤:

[/tmp/Foo.hs:(2,1)-(3,17)] > :step
Stopped at /tmp/Foo.hs:2:9-17
_result :: Int = _
g :: Integral b => b -> Int = _
x :: Int = 42
既然
g
在范围内,我们可以像任何顶级函数一样使用它:

[/tmp/Foo.hs:2:9-17] > g 2
1764
[/tmp/Foo.hs:2:9-17] > g 3
74088

GHCi中定义的函数可以做类似的事情吗?@brence:你不能在交互定义的函数上设置断点。所以不,我不这么认为。