Эта страница может помочь.
Debug.trace
- ваш друг, он позволяет вам выполнить некоторую отладку printf
. Он оценивает и печатает свой первый аргумент, а затем возвращает свой второй. Так что если у вас есть что-то вроде
foo :: Show a => a -> a
foo = bar . quux
Вы можете отладить «значение» параметра foo, изменив foo
на следующее:
import Debug.Trace(trace)
foo :: Show a => a -> a
foo x = bar $ quux $ trace ("x is: " ++ show x) x
foo теперь будет работать так же, как и раньше, но когда вы вызываете foo 1
, теперь он будет печатать x is: 1
в stderr при оценке.
Для более глубокой отладки вы захотите использовать команды отладки GHCI. В частности, это звучит так, как будто вы ищете команду :force
, которая вынуждает вычислять переменную и печатает ее. (Альтернативой является команда :print
, которая печатает столько переменных, сколько было оценено, без дополнительной оценки.)
Обратите внимание, что :force
более полезен для определения содержимого переменной, но может также изменить семантику вашей программы (если ваша программа зависит от лени).
Общий рабочий процесс отладки GHCI выглядит примерно так:
- Используйте
:break
для установки точек останова
- Используйте
:list
и :show context
, чтобы проверить, где вы находитесь в коде
- Используйте
:show bindings
для проверки привязок переменных
- Попробуйте использовать
:print
, чтобы увидеть, что в данный момент связано
- Используйте
:force
при необходимости, чтобы проверить ваши привязки
Если вы пытаетесь отлаживать бесконечный цикл, также полезно использовать
:set -fbreak-on-error
:trace myLoopingFunc x y
Затем вы можете нажать Ctrl-C
во время цикла и использовать :history
, чтобы увидеть, что зацикливается.