2016-01-09 26 views
7

ho eseguito un codice attraverso GHCI, e ottenuto questo errore:più descrittivo messaggi di errore da GHC

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

Dopo un po 'ho continuato a risolvere il bug (che è stato causato, come si potrebbe immaginare, da un indice troppo grande), ma vorrei che GHC mi avesse detto in quale linea si stava valutando questo grande indice.

c'è un modo per entrambi i

  • A) fanno GHCI più prolisso, o
  • B) utilizzare una pratica comune che evita questo errore in qualche modo (timido di utilizzare indici più piccoli, ovviamente)
+0

digitando dipendente sarebbe una soluzione rapida ... –

risposta

5

You can use GHC's profiling facilities to get a kind of stack trace on errors, per esempio, si supponga che questo è il file sorgente:

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

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

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

Se si compila questo con

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

quindi eseguirlo come

./StackTrace +RTS -xc 

poi si arriva

*** 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 

cui almeno ti dice la catena mainfoo.