我面临的问题是,我需要以某种方式将trace的控制台输出重定向到一个文件,因为结果非常大。
我知道原则上这是一个隐藏的副作用,但我不想使用IO-Monad。
我使用的是Windows。
发布于 2014-11-09 03:35:03
请,请,请使用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 monad,您肯定不会那么头疼。如果你只是在写东西,就像我想象的那样,你也可以使用一个Writer String,然后把输出写到文件中。
https://stackoverflow.com/questions/26821067
复制相似问题