मैं अपना खुद का sum
फ़ंक्शन लिखकर pipes
पैकेज सीखने की कोशिश कर रहा हूं और मैं स्टंप हो रहा हूं। मैं Pipes.Prelude
से उपयोगिता कार्यों का उपयोग नहीं करना चाहता (क्योंकि इसमें sum
और fold
और अन्य फ़ंक्शन जो इसे छोटा बनाते हैं) और केवल Pipes.Tutorial
में वर्णित जानकारी का उपयोग करें। ट्यूटोरियल Proxy
के रचनाकारों के बारे में बात नहीं करता है, लेकिन अगर मैं sum
और fold
के स्रोत में देखता हूं तो यह उन रचनाकारों का उपयोग करता है और मुझे आश्चर्य है कि इन निम्न स्तर के विवरणों के बिना मेरे sum
फ़ंक्शन को लिखना संभव है या नहीं।हास्केल पाइप्स "योग" फ़ंक्शन कैसे लिखें?
मुझे इस बात के साथ आने में परेशानी हो रही है कि यह फ़ंक्शन मूल्यों को तब तक जारी रखने में सक्षम होगा जब तक कि मूल्य उपलब्ध हों, और फिर किसी भी तरह उपयोगकर्ता को उस राशि को वापस कर दें। मुझे लगता है कि प्रकार होगा:
sum' :: Monad m => Consumer Int m Int
यह मेरे लिए प्रकट होता है यह इस समारोह मूल्यों का उपभोग कर सकता है जब तक वहाँ कोई और अधिक कर रहे हैं, तब अंतिम राशि लौटने क्योंकि काम कर सकता था। मैं इसे इस तरह का प्रयोग करेंगे:
mysum <- runEffect $ inputs >-> sum'
हालांकि, Pipes.Prelude
में समारोह के बजाय निम्नलिखित हस्ताक्षर हैं:
sum :: (Monad m, Num a) => Producer a m() -> m a
तो मुझे लगता है कि यह मेरी पहली बाधा है। sum
फ़ंक्शन Producer
को >->
का उपयोग करने के विरोध के रूप में एक तर्क के रूप में क्यों लेता है?
FYI करें मैं danidiaz से जवाब के बाद निम्नलिखित के साथ समाप्त हो गया:
sum' = go 0
where
go n p = next p >>= \x -> case x of
Left _ -> return n
Right (_, p') -> go (n + 1) p'
अच्छी तरह से 'पाइप में sum' कुछ है कि * * संख्या पैदा करता है और एक monadic कार्रवाई में उन्हें का सार लेता है ... विचार काफी समान है यदि आप इसके बारे में सोचते हैं तो आपके लिए भी - पैकेज भी डिज़ाइन किया गया है ताकि आपको विवरणों की परवाह नहीं करनी चाहिए, लेकिन 'फ़ोल्ड' और शेष प्रदान किए गए प्राइमेटिव्स का उपयोग करें;) – Carsten