GHCi - точка останова пропускается при втором запуске - PullRequest
2 голосов
/ 29 января 2012

Я новичок в Haskell и получаю раздражающее поведение при отладке.

  1. Я добавляю свою точку останова, используя: break
  2. Я запускаю основной
  3. Все в порядке
  4. Я печатаю: продолжить, чтобы завершить выполнение

Когда я перезапускаю main, точка останова больше не срабатывает, но точка останова не была удалена, потому что: show breaks перечисляет ее. Кто-нибудь знает, что происходит?

Я на Ubuntu 11.10, 64 бита. Завтра я опробую его в другой среде.

Спасибо

Ответы [ 2 ]

2 голосов
/ 30 января 2012

Трудно понять, не видя код, но похоже, что при втором запуске main точка останова никогда не будет достигнута, потому что результат кэшируется из-за ленивой оценки.Вероятно, это был THUNK (приостановленная оценка) в первый раз, а во второй раз он уже оценен.

0 голосов
/ 28 мая 2013

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

Например, следующий фрагмент правой части 'papperlap' будет заменен узлом косвенного обращения, указывающим на '4'.

bla x = x + 1
papperlap = bla 3

Если вы установите точку останова на «bla» и дважды запросите «papperlap», вы увидите, что «bla» применяется только один раз. Но если вы дважды спросите «bla 3», мы также остановимся дважды:

*Main> :break bla
Breakpoint 0 activated at meerbla.hs:1:1-13
*Main> papperlap
Stopped at meerbla.hs:1:1-13
_result :: a = _
[meerbla.hs:1:1-13] *Main> :continue
4
*Main> papperlap
4
*Main> bla 3
Stopped at meerbla.hs:1:1-13
_result :: a = _
[meerbla.hs:1:1-13] *Main> :continue
4
*Main> bla 3
Stopped at meerbla.hs:1:1-13
_result :: a = _
[meerbla.hs:1:1-13] *Main> :continue
4
...