2016-01-09 38 views
7

wpadłem trochę kodu poprzez GHCI i dostał ten błąd:bardziej opisowy Komunikaty o błędach GHC

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

Po chwili poszedł na naprawić błąd (co było spowodowane, jak można sobie wyobrazić, w drodze indeks, który był zbyt duży), ale chciałbym, aby GHC powiedział mi, w jakiej linii jest oceniany ten duży indeks.

Czy istnieje sposób, aby zarówno

  • A) sprawiają GHCI bardziej gadatliwy lub
  • B) wykorzystują powszechną praktyką, że unika ten błąd jakoś (nieśmiały korzystania mniejsze indeksy, oczywiście)
+0

Pisanie zależne jest szybkie i szybkie ... –

Odpowiedz

5

You can use GHC's profiling facilities to get a kind of stack trace on errors, na przykład, załóżmy, że jest to plik źródłowy:

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

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

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

Jeśli skompilować to z

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

następnie uruchomić go jako

./StackTrace +RTS -xc 

następnie dostać

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

których przynajmniej powie Ci łańcuch mainfoo.