Как я могу определить "catchOutput", так что запуск основных выходов только "бар"?
То есть, как я могу получить доступ как к выходному потоку (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")
Лучшее гипотетическое "решение", которое я нашел до сих пор, включает отключение stdout, вдохновленный этим, в поток файлов, а затем чтение из этого файла (помимо того, что супер-уродливый Я не смог прочитать сразу после записи из файла. Можно ли создать "настраиваемый поток буфера", который не нужно хранить в файле?). Хотя это немного похоже на боковую дорожку.
Другой угол, похоже, использует "hGetContents stdout", если он должен делать то, что, как я думаю, должен. Но мне не дано разрешение на чтение из stdout. Хотя googling, похоже, показывает, что он использовался .