2016-01-09 2 views
7

Я побежал код через GHCI, и получил эту ошибку:более описательные сообщения об ошибках GHC

*** Exception: Prelude.!!: index too large 

Через некоторое время я продолжал исправить ошибку (которая была вызвана, как вы можете себе представить, по слишком большой индекс), но я бы хотел, чтобы GHC сказал мне, в какой строке оценивается этот большой индекс.

Есть ли способ либо

  • A) делают GHCI более многословной, или
  • B) использует общую практику, которая позволяет избежать этой ошибки как-то (стесняется использовать меньшие показатели, конечно)
+0

зависимая печать будет быстро исправить ... –

ответ

5

You can use GHC's profiling facilities to get a kind of stack trace on errors, к примеру, предположим, что это ваш исходный файл:

xs :: [Int] 
xs = [1..10] 

foo :: Int -> IO() 
foo i = print $ xs !! i 

main :: IO() 
main = mapM_ foo [1..10] 

Если вы собираете это с

ghc --make -prof -fprof-auto StackTrace.hs 

затем запустить его как

./StackTrace +RTS -xc 

тогда вы получите

*** Exception (reporting due to +RTS -xc): (THUNK_1_0), stack trace: 
    GHC.List.CAF 
    --> evaluated by: Main.foo, 
    called from Main.main, 
    called from Main.CAF 
StackTrace: Prelude.!!: index too large 

, который по крайней мере, говорит вам цепь mainfoo.

Смежные вопросы