mainを実行すると 'bar'だけが出力されるように 'catchOutput'をどのように定義できますか?haskellでstdoutをキャッチ/ハイジャックする
つまり、出力ストリーム(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」が別の角度で使用されていると思われます。しかし、私はstdoutから読むことが許可されていません。グーグルでは、それはusedであることを示すようだ。
あなたの使用状況に応じて、移植性が問題であるかどうかによって、この実験的ライブラリを使用できます。 https://hackage.haskell.org/package/system-posix-redirect-1.1.0.1/docs/System-Posix -Redirect.html –