2013-06-24 3 views
28

मैं अवधारणा सीखना चाहता हूं, ताकि मैं machines जैसे पुस्तकालयों को समझ सकूं और उपयोग कर सकूं।मशीन्स और कंडिट्स (या अन्य समान पुस्तकालयों) के बीच वैचारिक अंतर क्या है?

मैंने Rúnar Bjarnason's talk on machines का पालन करने की कोशिश की, लेकिन मूल रूप से डेटा प्रकारों का एक समूह बहुत कम जानकारी है। मैं भी क्या नहीं समझ सकता k

newtype Machine k o = Step k o (Machine k o) 
data Step k o r = Stop 
       | Yield o r 
       | forall t . Await (t -> r) (k t) r 

में है या क्या t है और क्यों यह मात्रा निर्धारित है। या, कंड्यूट-पुस्तकालयों और मशीनों के बीच वैचारिक अंतर क्या है?

उत्तर

44

conduit और pipes दोनों कहीं अधिक machines से परिपक्व हैं, लेकिन - कि कहा - machinesconduit और pipes से एक अलग रास्ता लेने की कोशिश कर रहा है।

machines के साथ, मैं प्रकार तर्कों के संदर्भ में अपेक्षाकृत सरल एपीआई की कोशिश कर रहा हूं। conduit और pipes दोनों ने 5-6 विभिन्न प्रकार परिवर्तनीय तर्कों का उपयोग करके अपनी सभी अवधारणाओं को एकजुट करना चुना है।

मशीनें अपने "इनपुट भाषा" है, जो (या दो एक Plan के मामले में) एक भी अतिरिक्त तर्क पर सभी जिम्मेदारी डालता है पर एक मशीन (या Plan) parameterizing का अलग तरीका अपनाते हैं। इस तरह इनपुट भाषा को पैरामीटर करने के लिए भी इस तरह से मशीनों का उपयोग करने की संभावनाएं खुलती हैं जो कई इनपुट स्रोतों से इनपुट (गैर-) को निश्चित रूप से स्वीकार कर सकती हैं। परिणाम मूल रूप से एक अतिरिक्त 'emit' निर्देश के साथ एक मुफ़्त मोनड है!

मशीनों का निर्माण और उपयोग करने के तरीके के बारे में थोड़ा और कठोर नीति के बदले में, यह अंततः परिणामस्वरूप कोड के एसिम्पटोटिक्स के बारे में बेहतर सुरक्षा प्रदान कर सकता है।

जिसके अनुसार, pipes और conduit असली दुनिया उपयोग का एक बहुत पड़ा है और machines कम या ज्यादा मेरे लिए एक खेल का मैदान, रुनर Bjarnason और पॉल Chiusano है।

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

अब, उस मात्रात्मक के बारे में!

t वास्तव में अस्तित्व में प्रमाणित है। ऐसा करके हम Monad मशीनों के लिए k पैरामीटर की functoriality की परवाह नहीं कर सकते हैं। यह महत्वपूर्ण है क्योंकि Source लागू किया गया है। मैं काम करने के लिए Source जरूरत नहीं थी, तो हम इस्तेमाल कर सकते हैं सरल

data Step k o r = Stop 
       | Yield o r 
       | Await (k r) r 

यह दुर्भाग्यपूर्ण पक्ष प्रभाव होता है कि जब आप एक Source के साथ एक मशीन की रचना करने, कि संकलक पता नहीं चला गया क्या Functor उदाहरण लेने के लिए और आप अनावश्यक प्रकार की टिप्पणियों में तैर रहे होंगे।

kan-extensions पैकेज पर काम करते समय मौजूद एक चाल है जो मैंने उठाया है। यह वहां से Yoneda प्रकारों में से एक का सामान्यीकरण है।

+1

धन्यवाद, क्या आप शायद 'के' के बारे में कुछ बता सकते हैं? 'प्रतीक्षा' में 'के आर' क्यों शामिल है, विशेष रूप से, 'k :: * -> *' और 'r' द्वारा parametrized क्यों है? मैंने 'टी', 'वाई' और 'इज़' की जांच करने की कोशिश की, अलग-अलग 'के' के कुछ उदाहरण देखने के लिए, लेकिन फिर भी मैं इसे समझने से बहुत दूर हूं। –

+4

'k a' एक ऐसा प्रकार का अनुरोध है जिसे आप डेटा को खिला रहे हैं जो भी कर रहे हैं। 'ए 'अनुरोध के परिणाम का प्रतिनिधित्व करता है। 'प्रतीक्षा' प्रभावी ढंग से दो तर्क हैं: "अनुरोध सफल होने पर क्या करना है" और "विफलता पर क्या करना है"। एक इनपुट के लिए आप k = (->) i' का उपयोग कर सकते हैं ताकि 'मशीन ((->) i)' को '(i -> r)' से एक फ़ंक्शन दिया गया हो ताकि आप इनपुट की आपूर्ति कर सकें। 'टी' के साथ आप दो कार्यों में से एक के साथ हवादार हो जाते हैं ताकि आप या तो इनपुट को अलग से ब्लॉक कर सकें। 'वाई' आपको एक ही समय में या तो दोनों इनपुट पर अवरुद्ध करने की अनुमति देता है। 'Is' का उपयोग अभी' (->) 'जैसा किया जाता है। –

+1

एक और सवाल, 'योजना और' मशीन क्यों हैं? भेद क्यों? –

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

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