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

时间:2012-04-03 05:48:18

标签: debugging haskell read-eval-print-loop ghci

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

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

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

1 个答案:

答案 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