Каков наилучший способ тестирования и взаимодействия с внутренними функциями, определенными внутри функции верхнего уровня?


когда я программирую на Javascript, я нахожу его очень удобно использовать отладчик, чтобы остановить выполнение программы в любой момент и иметь возможность запускать команды и проверять переменные оттуда.

теперь, вернувшись в Haskell, есть ли способ запускать произвольные функции в интерактивном ghci REPL или я ограничен вещами, объявленными на верхнем уровне?

каков "стандартный" подход к работе и отладке внутренних функций и значений?

1 68

1 ответ:

когда вы остановлены в точке останова в 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