GHCでCall Stackを表示する

テストのassertationやエラーログなどで使う。

GHC.Stackを使うとstackを取得できる。

{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE ImplicitParams #-}

import Data.Text (Text)  
import GHC.Stack

main = do  
    putStrLn "before error"
    printStack  - line 9
    putStrLn "after error"


printStack = do  
    putStrLn . show . head . reverse . getCallStack $ ?loc -- line 14

Output

before error  
("?loc",SrcLoc {srcLocPackage = "main", srcLocModule = "Main", srcLocFile = "app/Main.hs", srcLocStartLine = 14, srcLocStartCol = 55, srcLocEndLine = 14, srcLocEndCol\
 = 59})
after error  

ここで、printStackに制約を付け足すと、ここでのstackは無視されるようになる。

printStack :: (?loc :: CallStack) => IO ()  

Output

before error  
("printStack",SrcLoc {srcLocPackage = "main", srcLocModule = "Main", srcLocFile = "app/Main.hs", srcLocStartLine = 9, srcLocStartCol = 5, srcLocEndLine = 9, srcLocEnd\
Col = 15})  
after error