Come si può definire 'catchOutput' in modo che le uscite principali in esecuzione siano solo 'bar'?Acquisizione/dirottamento stdout in haskell
Cioè, come posso accedere separatamente al flusso di uscita (stdout) e all'effettiva uscita di un'azione 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")
La migliore "soluzione" ipotetica che ho trovato finora comprende la deviazione standard output, inspired by this, ad un flusso di file e quindi la lettura dal file (Oltre ad essere super-brutto non sono stato in grado di leggere direttamente dopo aver scritto da un file. È possibile creare un "flusso buffer personalizzato" che non deve essere archiviato in un file?). Anche se sembra un po 'come una traccia laterale.
Un altro angolo sembra utilizzare 'hGetContents stdout' se si suppone che faccia ciò che penso dovrebbe. Ma non mi è stato dato il permesso di leggere dallo stdout. Sebbene su Google, sembra mostrare che è stato used.
A seconda del caso di utilizzo e se la portabilità è un problema, è possibile utilizzare questa libreria sperimentale: https://hackage.haskell.org/package/system-posix-redirect-1.1.0.1/docs/System-Posix -Redirect.html –