मैं ListT
के विषय में pipes tutorial में प्रस्तुत उदाहरणों में से एक की समझ बनाने के लिए कोशिश कर रहा हूँ: उदाहरण के ऊपर से चलाया जाता हैपाइप्स ट्यूटोरियल: ListT उदाहरण
import Pipes
import qualified Pipes.Prelude as P
input :: Producer String IO()
input = P.stdinLn >-> P.takeWhile (/= "quit")
name :: ListT IO String
name = do
firstName <- Select input
lastName <- Select input
return (firstName ++ " " ++ lastName)
, तो हम निम्नलिखित की तरह उत्पादन मिलता है:
>>> runEffect $ every name >-> P.stdoutLn
Daniel<Enter>
Fischer<Enter>
Daniel Fischer
Wagner<Enter>
Daniel Wagner
quit<Enter>
Donald<Enter>
Stewart<Enter>
Donald Stewart
Duck<Enter>
Donald Duck
quit<Enter>
quit<Enter>
>>>
ऐसा लगता है कि:
- आप इस (GHCi पर), पहला नाम आप इनपुट Wil चलाते हैं मैं बाध्य हो जाता हूं और केवल दूसरा बदल जाएगा। मैं उम्मीद करता हूं कि दोनों उत्पादक (
Select input
द्वारा परिभाषित) इनपुट पढ़ने पर मोड़ ले सकते हैं (शायद गैर-निर्धारक रूप से)। quit
दर्ज करना एक बार पहले नाम को फिर से बांधने की अनुमति देगा। दोबारा, मैं यह देखने में असफल रहा कि क्योंfirstName
उपयोगकर्ता द्वारा दर्ज किए गए पहले मान से जुड़ा होगा।- पंक्ति में दो बार
quit
दर्ज करना प्रोग्राम को समाप्त कर देगा। हालांकि, मैं उम्मीद करता हूं किquit
को प्रोग्राम छोड़ने के लिए केवल दो बार प्रवेश करना होगा (संभवतः अन्य इनपुट के साथ वैकल्पिक)।
मुझे ऊपर दिए गए उदाहरण के तरीके के बारे में कुछ मौलिक याद आ रही है, लेकिन मैं नहीं देख सकता।
ए साइड नोट बन: 'ListT'," पुनरावृत्ति इकाई ट्रांसफार्मर "मॉड्यूल में' 'free' पैकेज के Control.Monad.Trans.Iter' के विपरीत जाने करता है 'MonadPlus' उदाहरण का उपयोग करके" पैरालेल में "कार्रवाइयों की प्रभावशाली सूचियां लिखें। http://hackage.haskell.org/package/free-4.12.4/docs/Control-Monad-trans-Iter.html https://gist.github.com/danidiaz/e9382127d1c4025b9845 – danidiaz