2012-04-02 16 views
33

मैं अपने आप से गहराई से समझने वाले किसी व्यक्ति से सुनना चाहता हूं कि मौलिक मतभेद Enumerators, Conduits, और Pipes के साथ-साथ प्रमुख लाभ और दोषों के बीच हैं। कुछ discussion's alreadyongoing लेकिन उच्च स्तर का अवलोकन होना अच्छा लगेगा।एन्युमरेटर्स बनाम कंडीशंस बनाम पाइप्स के पेशेवरों और विपक्ष क्या हैं?

+4

कंडिटेक्ट्स और पाइप्स अभी भी भारी संशोधन से गुजर रहे हैं, इसलिए जब तक वे व्यवस्थित न हों तब तुलना करना और विपरीत होना मुश्किल है। आदर्श स्थिति में, नशीले पदार्थों और पाइप गणक करने के लिए सही तरीके से विलय करेंगे। –

उत्तर

28

ूगणकों/एक अमूर्त रूप में Iteratees ओलेग Kiselyov द्वारा आविष्कार किया गया। वे अनुमानित (कम) संसाधन आवश्यकताओं के साथ आईओ करने का एक साफ तरीका प्रदान करते हैं। वर्तमान एन्युमरेटर पैकेज ओलेग के मूल कार्य के बहुत करीब है।

यसोड वेब ढांचे के लिए कंडिट बनाए गए थे। मेरी समझ यह है कि वे तेजी से तेज होने के लिए डिजाइन किए गए थे। पुस्तकालय के शुरुआती संस्करण बेहद सतर्क थे।

पाइप्स लालित्य पर ध्यान केंद्रित करते हैं। उनके पास कई, फॉर्म मोनैड (ट्रांसफॉर्मर) और श्रेणी के उदाहरणों के बजाय केवल एक प्रकार है, और डिजाइन में बहुत "कार्यात्मक" हैं।

आप स्पष्ट स्पष्टीकरण की तरह हैं: Pipe प्रकार निम्नलिखित धर्मभ्रष्ट सरल functor

data PipeF a b m r = M (m r) | Await (a -> r) | Yield b r 
instance Monad m => Functor (PipeF a b m) where 
    fmap f (M mr) = M $ liftM mr 
    fmap f (Await g) = Await $ f . g 
    fmap f (Yield b p) = Yield b (f p) 
--Giving: 
newtype Pipe a b m r = Pipe {unPipe :: Free (PipeF a b m) r} 
    deriving (Functor, Applicative, Monad) 

--and 
instance MonadTrans (Pipe a b) where 
    lift = Pipe . inj . M 

वास्तविक पाइप परिभाषा इन में पकाया जाता है से अधिक सिर्फ मुक्त इकाई है, लेकिन इस परिभाषा की सादगी अद्भुत है। पाइप ऑपरेशन (<+<) :: Monad m => Pipe c d m r -> Pipe a b m r -> Pipe a d m r के तहत एक श्रेणी बनाते हैं जो पहले पाइप yields लेता है और इसे दूसरे पाइप की प्रतीक्षा में खिलाता है।

ऐसा लगता है कि Conduits और की तरह अधिक Pipe होने के लिए आगे बढ़ रहा है (सीपीएस उपयोग करने के बजाय राज्य की, और एक ही प्रकार का उपयोग करने जा), जबकि पाइप्स बेहतर त्रुटि से निपटने के लिए समर्थन प्राप्त कर रहे हैं, जनरेटर और उपभोक्ताओं के लिए अलग प्रकार के शायद वापसी ।

यह क्षेत्र तेज़ी से आगे बढ़ रहा है। मैं इन सुविधाओं के साथ पाइप लाइब्रेरी के एक प्रयोगात्मक संस्करण पर हैकिंग कर रहा हूं, और अन्य लोगों को भी पता है (हैकेज पर संरक्षित पाइप पैकेज देखें), लेकिन संदेह है कि गेब्रियल (पाइप्स के लेखक) उन्हें पहले बताएंगे कर।

मेरी सिफारिशें: यदि आप यसोड का उपयोग कर रहे हैं, तो कंडिट का उपयोग करें। यदि आप परिपक्व लाइब्रेरी का उपयोग एन्यूमेरेटर चाहते हैं। यदि आप मुख्य रूप से लालित्य की परवाह करते हैं, तो पाइप का उपयोग करें।

7

सभी तीन पुस्तकालयों के साथ आवेदन पत्र लिखने के बाद, मुझे लगता है कि सबसे बड़ा अंतर यह मैंने देखा है कि कैसे संसाधन को अंतिम रूप देने नियंत्रित किया जाता है में है। उदाहरण के लिए, पाइप्स विभिन्न प्रकार के फ्रेम्स और स्टैक्स में संसाधन अंतिम रूप को तोड़ देता है।

वहाँ भी अभी भी के बारे में कैसे न केवल इनपुट संसाधन को अंतिम रूप देने में कुछ विवाद हो रहा है, लेकिन यह भी संभावित उत्पादन संसाधन। उदाहरण के लिए, यदि आप डीबी से पढ़ रहे हैं और फ़ाइल में लिख रहे हैं, तो डीबी के कनेक्शन को बंद करने की आवश्यकता है और आउटपुट फ़ाइल को फ्लश और बंद करने की आवश्यकता है। पाइपलाइन के साथ अपवादों और विफलता मामलों को संभालने का निर्णय लेने पर चीजें बालों वाली होती हैं।

एक और अधिक सूक्ष्म अंतर कैसे प्रगणक पाइप लाइन के द्वारा दिया गया मान संभाला और गणना की जाती है हो रहा है।

इन मतभेदों और संभावित विसंगतियों का एक बहुत इकाई और पाइपों के लिए श्रेणी कार्यान्वयन के प्रयोग से अवगत कराया गया है और अब मुहैया कराने का साधन में अपना रास्ता बना रहे हैं।

संबंधित मुद्दे

 संबंधित मुद्दे