Как я могу определить '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', если предполагается, что он делает то, что, как я думаю, должен. Но мне не дают разрешения на чтение с stdout. Хотя поиск в Google, кажется, показывает, что он был использован .