Подтвердить что ты не робот

Как отобразить обратную трассировку для ошибки, выброшенной в Haskell

В настоящее время я отлаживаю алгоритм, который я реализовал в Haskell для моей дипломной диссертации. Кажется, что он работает правильно для большинства входов, но я нашел один вход, который заставляет GHC вызывать ошибку

*** Исключение: Map.find: элемент не на карте

Так как у меня есть много поисков Map в моем коде, мне нужно найти строку, бросающую эту ошибку, чтобы понять ее. Я прочитал это руководство, но хотя я установил флаг fbreak-on-exception-error), все GHCi дают мне после отслеживания функции я 'm тестирование:

[...]> :trace test
[...]
Stopped at <exception thrown>
_exception ::
  e = GHC.Exception.SomeException (GHC.Exception.D:Exception _
                                                         (GHC.Show.D:Show ...) ....)
                              (GHC.Exception.ErrorCall ['M',....])
Unable to list source for <exception thrown>
Try rerunning with :trace, :back then :list
[<exception thrown>] [...]> :history
Empty history. Perhaps you forgot to use :trace?

Попытка :trace снова также не помогает.

Итак, может кто-нибудь сказать мне, что происходит не так, или предложить другой способ найти оскорбительную линию? Спасибо заранее!

PS: Я использую GHC версии 7.0.3, поэтому связанное руководство должно применяться.

4b9b3361

Ответ 1

Возможно, это поможет вам

http://www.haskell.org/haskellwiki/Debugging

LocH предоставляет оболочки для assert для генерации исключений и ошибок, связанных с источником.
...
добавив: import Debug.Trace.Location, а затем перекомпилировав препроцессор на:

 $ghc A.hs --make -pgmF loch -F -no-recomp [1 из 1] Компиляция Main (A.hs, A.o) Связывание A... $./A A: A.hs: 14: 14-19: Maybe.fromJust: Nothing

В вики также есть другие советы, например, используя Безопасная библиотека.