如何在Haskell中使用行号和堆栈跟踪进行打印?

时间:2016-02-08 01:43:52

标签: debugging haskell

我将Java附加到我的print语句中,并且它们有一个堆栈跟踪...

How can we print line numbers to the log in java

public static int getLineNumber() {
    // The second row of the stack trace had the caller file name, etc.
    return Thread.currentThread().getStackTrace()[2];
}

我如何做到这一点是Haskell?

3 个答案:

答案 0 :(得分:3)

一个选项似乎是使用像loc-th这样的库,例如,您可以使用行信息编写错误消息:

{-# LANGUAGE TemplateHaskell #-}
-- app/Main.hs
module Main where

import Debug.Trace.LocationTH

main :: IO ()
main = do
    $failure "Error"
    putStrLn "Hello"

给了我

my-exe: app/Main.hs:10:5-12: Error

它还提供了一个可以查看的字符串,以便确定行号。但是,根据您的使用情况,我认为这有点令人不悦。例如,我不希望看到此方法仅用于记录行号。

关于Haskell调试技术的更多内容here

老实说,也许这不是最好的主意。你打算用行号做什么?

答案 1 :(得分:3)

我想我找到了一个解决方案:

  

Debug.Trace:跟踪和监视执行的函数。

     

traceStack :: String - > a - >来源

     

与trace类似,但如果有可用的话,还会打印一个调用堆栈。

     

在当前的GHC实现中,只有在调用堆栈时才可以使用   该程序是用-prof编译的;否则traceStack行为   完全像痕迹。调用堆栈中的条目对应于SCC   注释,所以使用-fprof-auto或者是一个好主意   -fprof-auto-calls自动添加SCC注释。

     

自:4.5.0.0

^ https://hackage.haskell.org/package/base-4.8.2.0/docs/Debug-Trace.html

答案 2 :(得分:0)

如@ user2407038的comment所述,现代GHC通过隐式参数提供CallStack,请参阅http://haddock.stackage.org/lts-5.2/base-4.8.2.0/GHC-Stack.html#t:CallStack处的文档。

您需要扩展程序-XImplicitParams

然后它就像:

一样简单
{-# LANGUAGE ImplicitParams #-}
import           GHC.Stack

msgStacktraced :: (?loc :: CallStack) => String -> IO ()
msgStacktraced msg = putStrLn (msg ++ "\n" ++ showCallStack ?loc)