¿Cómo puedo definir 'catchOutput' para que la ejecución principal produzca solo 'bar'?Captura/secuestro de stdout en haskell
Es decir, ¿cómo puedo acceder tanto al flujo de salida (stdout) como a la salida real de una acción io por separado?
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")
El mejor "solución" hipotético que he encontrado hasta el momento incluye el desvío de la salida estándar, inspired by this, a una secuencia de archivo y luego la lectura de ese archivo (Además de ser súper feo no he sido capaz de leer directamente después de escribir desde un archivo. ¿Es posible crear una "secuencia de almacenamiento intermedio personalizada" que no tenga que almacenar en un archivo?). Aunque eso se siente "un poco" como una canción secundaria.
Otro ángulo parece utilizar 'hGetContents stdout' si se supone que debe hacer lo que creo que debería. Pero no tengo permiso para leer de stdout. Aunque Google parece mostrar que ha sido used.
Dependiendo de su caso de uso, y si la portabilidad es un problema, puede utilizar esta biblioteca experimental: https://hackage.haskell.org/package/system-posix-redirect-1.1.0.1/docs/System-Posix -Redirect.html –