在顶层函数中定义的内部函数测试和交互的最佳方法是什么?

hug*_*omg 70 debugging haskell ghci read-eval-print-loop

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

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

工作和调试内部函数和值的"标准"方法是什么?

ham*_*mar 85

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

foo :: Int -> Int
foo x = g (x + 2)
  where g y = x^y 
Run Code Online (Sandbox Code Playgroud)

您可以设置断点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 = _
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

现在这g是在范围内,我们可以像任何顶级函数一样使用它:

[/tmp/Foo.hs:2:9-17] > g 2
1764
[/tmp/Foo.hs:2:9-17] > g 3
74088
Run Code Online (Sandbox Code Playgroud)

  • @brence:您无法在交互式定义的函数上设置断点.所以不,我不这么认为. (2认同)