Каков наилучший способ тестирования и взаимодействия с внутренними функциями, определенными внутри функции верхнего уровня?
когда я программирую на Javascript, я нахожу его очень удобно использовать отладчик, чтобы остановить выполнение программы в любой момент и иметь возможность запускать команды и проверять переменные оттуда.
теперь, вернувшись в Haskell, есть ли способ запускать произвольные функции в интерактивном ghci REPL или я ограничен вещами, объявленными на верхнем уровне?
каков "стандартный" подход к работе и отладке внутренних функций и значений?
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