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