2016-01-09 11 views
7

lief ich einige Codes durch GHCI, und haben diesen Fehler:kräftigere Fehlermeldungen von GHC

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

Nach einer Weile ich ging auf den Fehler zu beheben (das verursacht wurde, wie man sich vorstellen kann, durch eine Index, der zu groß war), aber ich wünschte, GHC hätte mir gesagt, auf welcher Linie dieser große Index bewertet wurde.

Gibt es eine Möglichkeit, entweder

  • A) machen GHCI ausführlichere oder
  • B) eine gemeinsame Praxis verwenden, die irgendwie diesen Fehler vermeidet (shy von kleineren Indizes verwendet, natürlich)
+0

abhängige Typisierung wäre eine schnelle Lösung ... –

Antwort

5

You can use GHC's profiling facilities to get a kind of stack trace on errors, zum Beispiel an, dass diese Datei Ihrer Quelle:

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

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

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

Wenn Sie diese kompilieren mit

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

führen Sie es dann als

./StackTrace +RTS -xc 

dann erhalten Sie

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

zumindest mit dem Sie die mainfoo Kette erzählt.