当我使用Javascript编程时,我发现非常方便能够使用调试器在任何时候暂停程序执行,并能够运行命令并从那里检查变量。
现在,回到Haskell,有没有办法在交互式GHCI REPL中运行任意函数,还是仅限于在顶层声明的事情?
工作和调试内部函数和值的“标准”方法是什么?
答案 0 :(得分:85)
当您在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