【发布时间】:2012-02-25 20:14:46
【问题描述】:
如何定义 'catchOutput' 以便运行主输出仅 'bar'?
也就是说,如何分别访问输出流 (stdout) 和 io 操作的实际输出?
catchOutput :: IO a -> IO (a,String)
catchOutput = undefined
doSomethingWithOutput :: IO a -> IO ()
doSomethingWithOutput io = do
(_ioOutp, stdOutp) <- catchOutput io
if stdOutp == "foo"
then putStrLn "bar"
else putStrLn "fail!"
main = doSomethingWithOutput (putStr "foo")
到目前为止,我发现的最好的假设“解决方案”包括将标准输出 inspired by this 转移到文件流中,然后从该文件中读取(除了超级丑陋之外,我无法读取从文件写入后直接。是否可以创建一个不必存储在文件中的“自定义缓冲流”?)。虽然这感觉“有点”像边路。
如果应该做我认为应该做的事情,另一个角度似乎使用了“hGetContents stdout”。但我没有被允许从标准输出读取。虽然谷歌搜索似乎表明它是used。
【问题讨论】:
-
根据您的用例,以及可移植性是否是一个问题,您可以使用这个实验库:hackage.haskell.org/package/system-posix-redirect-1.1.0.1/docs/…