में stdout को पकड़ना/अपहरण करना मैं 'कैचऑटपुट' को कैसे परिभाषित कर सकता हूं ताकि मुख्य आउटपुट केवल 'बार' चल रहा हो?हैकेल
यही है, मैं आउटपुट स्ट्रीम (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")
सबसे अच्छा काल्पनिक "समाधान" मैंने पाया अब तक शामिल हैं stdout, inspired by this डाइवर्ट, एक फ़ाइल धारा को और फिर उस फ़ाइल (से पढ़ने सुपर बदसूरत जा रहा है मैं पढ़ने में सक्षम नहीं किया गया इसके अलावा फ़ाइल से लिखने के बाद सीधे। क्या "कस्टम बफर स्ट्रीम" बनाना संभव है जिसे फ़ाइल में स्टोर करने की आवश्यकता नहीं है?)। हालांकि यह एक साइड ट्रैक की तरह 'थोड़ा' लगता है।
एक और कोण 'hGetContents stdout' का उपयोग करने लगता है अगर ऐसा लगता है कि मुझे ऐसा करना चाहिए। लेकिन मुझे stdout से पढ़ने की अनुमति नहीं दी गई है। हालांकि गुगलिंग यह दिखाता है कि यह used रहा है।
आपके उपयोग के मामले के आधार पर, और पोर्टेबिलिटी एक मुद्दा है, तो आप इस प्रयोगात्मक पुस्तकालय का उपयोग कर सकते हैं: https://hackage.haskell.org/package/system-posix-redirect-1.1.0.1/docs/System-Posix -Redirect.html –