我面临的问题是我需要以某种方式将trace
的控制台输出重定向到文件,因为结果非常大。
我知道它原则上是一个隐藏的副作用,但我不想使用IO
- Monad。
我正在使用Windows。
答案 0 :(得分: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
pragma实际上非常重要 - 否则GHC可能会在多个位置内联您的调用并复制您从中隐藏的效果。
如果你只使用IO
monad,那么你肯定会有一点头痛。如果你只是在编写东西,正如我想象的那样,你也可以使用Writer String
,然后将输出写入文件。