Jak zdefiniować "catchOutput" tak, aby główne wyjścia tylko "bar"?Catching/hijacking stdout w haskell
To znaczy, w jaki sposób można uzyskać dostęp zarówno do strumienia wyjściowego (standardowego), jak i rzeczywistego wyjścia działania 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")
Najlepszym „rozwiązanie” hipotetyczny znalazłem do tej pory obejmuje przekierowanie stdout, inspired by this, do strumienia pliku, a następnie odczyt z tego pliku (Poza tym jest super-brzydki nie byłem w stanie czytać bezpośrednio po napisaniu z pliku Czy możliwe jest utworzenie "niestandardowego strumienia bufora", który nie musi być zapisany w pliku?). Chociaż to "trochę" przypomina boczny tor.
Inny kąt wydaje się używać "hGetContents stdout", jeśli to ma robić to, co myślę, że powinien. Ale nie mam pozwolenia na czytanie ze stdouta. Mimo, że googlowałem, wydaje się, że było to used.
W zależności od Twojego przypadku użycia i tego, czy przenośność jest problemem, możesz użyć tej biblioteki eksperymentalnej: https://hackage.haskell.org/package/system-posix-redirect-1.1.0.1/docs/System-Posix -Redirect.html –