我将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?
答案 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)