2014-11-08 80 views
0

我面临的问题是我需要以某种方式将trace的控制台输出重定向到一个文件,因为结果非常大。如何将跟踪重定向到文件?

我知道它原则上有一个隐藏的副作用,但我不想使用IO -Monad。

我正在使用Windows。

回答

5

请请用IO


可以,原则上,通过使用unsafePerformIO :: IO a -> a完成这一恶行,但它是一个可怕的,可怕的罪,你容易在运行的古怪。

它实际上Debug.Trace如何做到这一点 - 这里是为Debug.Trace.trace来源:

{-# NOINLINE trace #-} 
trace :: String -> a -> a 
trace string expr = unsafePerformIO $ do 
    traceIO string 
    return expr 

注意,NOINLINE编译实际上是很重要的 - 否则GHC可能会内联您的呼叫在多个地方和复制的效果,你已经隐藏起来了。


你一定会拥有更小的头痛后,不过,如果你只需要使用IO单子。如果你只写东西,就像我想象的那样,你也可以用Writer String脱身,然后将输出写入文件。

+2

OP表示输出会很大,所以我不会使用'Writer String'。 – ErikR 2014-11-08 19:46:08

+0

如果你想[流式记录](http://www.haskellforall.com/2014/02/streaming-logging.html),你可以使用'pipes'中的'Producer' – 2014-11-09 04:04:29