Перехват / захват stdout в haskell

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

11
задан worldsayshi 25 February 2012 в 23:42
поделиться