Làm cách nào để xác định 'catchOutput' để chỉ chạy các kết quả đầu ra chính 'thanh'?Bắt giữ/lấy cắp dữ liệu stdout trong haskell
Tức là, làm cách nào tôi có thể truy cập cả luồng đầu ra (đầu ra) và đầu ra thực tế của tác vụ io riêng biệt?
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")
tốt nhất giả thuyết "giải pháp" tôi đã tìm thấy cho đến nay bao gồm chuyển hướng stdout, inspired by this, để một dòng tập tin và sau đó đọc từ tập tin đó (Bên cạnh đó là siêu xấu xí tôi đã không có khả năng đọc trực tiếp sau khi viết từ một tập tin Có thể tạo ra một "dòng đệm tùy chỉnh" mà không cần phải lưu trữ trong một tập tin?). Mặc dù cảm thấy 'hơi' giống như một ca khúc phụ.
Một góc khác có vẻ như sử dụng 'hGetContents stdout' nếu điều đó được cho là làm những gì tôi nghĩ. Nhưng tôi không được phép đọc từ stdout. Mặc dù googling nó dường như cho thấy rằng nó đã được used.
Tùy thuộc vào trường hợp sử dụng của bạn và liệu tính di động có phải là vấn đề bạn có thể sử dụng thư viện thử nghiệm này không: https://hackage.haskell.org/package/system-posix-redirect-1.1.0.1/docs/System-Posix -Redirect.html –