डिफ़ॉल्ट पाइप द्वारा पुल आधारित हैं। यह ऑपरेटर >->
के कारण है जो +>>
के माध्यम से लागू किया गया है जो कि उसकी पुल श्रेणी के लिए bind
ऑपरेटर है। मेरी समझ यह है कि इसका मतलब है कि यदि आपके पास producer >-> consumer
जैसे कोड हैं, तो उपभोक्ता के शरीर को पहले कॉल किया जाएगा, फिर डेटा की प्रतीक्षा करने के बाद, निर्माता को बुलाया जाएगा।एक पुल आधारित पाइप को पुश आधारित में कैसे चालू करें?
मैं pipes
प्रलेखन here है कि आप एक धक्का आधारित पाइप में एक पुल आधारित पाइप चालू करने के लिए Pipes.Core
से कोड (reflect .)
उपयोग कर सकते हैं में देखा है। इसका मतलब है (अगर मैं गलत हूं तो मुझे सही करें) कि producer >-> consumer
से ऊपर के कोड में, निर्माता पहले चलाया जाता है, एक मूल्य उत्पन्न करता है, तो उपभोक्ता उपभोग करने की कोशिश करता है। यह वास्तव में उपयोगी लगता है और मैं जानना चाहता हूं कि यह कैसे करें।
मैं भी विचार विमर्श here में देखा है >->
करने के लिए कोई धक्का आधारित समकक्ष है कि वहाँ है क्योंकि यह (मैं के साथ मान को प्रतिबिंबित?) के आसपास किसी भी पाइप चालू करने के लिए आसान है, लेकिन मैं वास्तव में यह कैसे करना है समझ नहीं सकता या कोई उदाहरण खोजें
stdin :: Producer String IO r
stdin = forever $ do
lift $ putStrLn "stdin"
str <- lift getLine
yield str
countLetters :: Consumer String IO r
countLetters = forever $ do
lift $ putStrLn "countLetters"
str <- await
lift . putStrLn . show . length $ str
-- this works in pull mode
runEffect (stdin >-> countLetters)
-- equivalent to above, works
runEffect ((\() -> stdin) +>> countLetters)
-- push based operator, doesn't do what I hoped
runEffect (stdin >>~ (\_ -> countLetters))
-- does not compile
runEffect (countLetters >>~ (\() -> stdin))