2016-02-02 6 views
8

Pipes Tutorial में, यह कहना है कि:हास्केल पाइप्स अप्रयुक्त आउटपुट को बंद करने के लिए अप्रयुक्त इनपुट और एक्स (निर्वासित प्रकार) को बंद करने के लिए "उपयोग() का उपयोग क्यों करता है"?

ठोस प्रकार समानार्थी शब्द () का उपयोग अप्रयुक्त इनपुट और X ( निर्जन प्रकार) बंद करने के लिए अप्रयुक्त आउटपुट बंद करने के लिए:

मैं चाहते हैं समझें कि () और X का उपयोग किस प्रकार किया जाता है। इनपुट और आउटपुट दोनों के लिए X या () क्यों नहीं?

+0

आप इस प्रश्न को और साथ ही उत्कृष्ट उत्तरों को देखना चाहेंगे: ["डेटा.वॉइड 'में' बेतुका 'कार्य क्या है?"] (Http://stackoverflow.com/questions/14131856/ –

उत्तर

6

X पाइपों में आमतौर पर Void को हास्केल पारिस्थितिक तंत्र के बाकी हिस्सों में लिखा जाता है, तो चलिए X = Void का बहाना करते हैं। यह इस तरह से परिभाषित किया है:

data Void 

और यह एक "एलिमिनेटर"

absurd :: Void -> a 
absurd x = case x of {} 

आप प्रकार Void के कुछ है, तो है (और यह बल), तो कुछ गलत चला गया है। आपके प्रोग्राम ने एक त्रुटि उत्पन्न की है, या यह एक अनंत लूप में फंस गया है।

एक पाइप बनाना Void प्रकार की चीजें कभी भी कुछ भी वैध (वैध) बनाने से रोकती हैं। इसे () प्रकार की चीजों का उत्पादन करने से यह चीजों का उत्पादन करने की अनुमति मिलती है, लेकिन ऐसी चीजें जिनमें कोई जानकारी नहीं होती है। वे मूल रूप से घड़ी की टिकटें हैं।

इनपुट पक्ष पर, Void प्रकार की चीजों का उपभोग करने वाली पाइप इनपुट का इंतजार कर सकती है, लेकिन जैसे ही यह ऐसा करती है, यह अटक जाती है - कोई भी इसे कुछ भी खिला नहीं पाएगा। एक पाइप जो () प्रकार की चीजों का उपभोग करती है, प्रतीक्षा कर सकती है, लेकिन केवल घड़ी की टिकटें मिलती हैं।

ये सभी विकल्प उचित हैं। मुझे संदेह है कि गोंजालेज़ चाहता था कि टाइप सिस्टम सिस्टम को शुद्ध उपभोक्ता को गलती से एक शुद्ध उपभोक्ता को गलत तरीके से जोड़ने के लिए प्रतिबंधित करे, और एक त्रुटि प्राप्त हो जो ट्रैक करना मुश्किल हो। एक शुद्ध निर्माता बनाकर () का उपभोग करें, और एक शुद्ध उपभोक्ता Void का उत्पादन करता है, इसलिए वह उन्हें गलत तरीके से हुक करना असंभव बनाता है।

+0

'Pipes.X' 'शून्य' पैकेज के 'शून्य' की तरह,' newtype X = XX', 'बंद (एक्स 'के साथ' क्या है-बेतुका-फ़ंक्शन-इन-डेटा-शून्य-उपयोगी-के लिए) एक्स) = 'absurd' के लिए बंद x', लेकिन बिंदु मूल रूप से वही है। – Michael

+0

@ माइकल, शायद यह इसलिए है क्योंकि यह एक विकासवादी अवशेष है जो अब से छुटकारा पाने में बहुत मुश्किल हो सकता है। 'शून्य' पैकेज वास्तव में केवल 'आधार' के पुराने संस्करणों के लिए उस कोड को संकलित करता है - अन्यथा अधिकांश पैकेज 'बेस' संस्करणों के पक्ष में कैबल द्वारा गठित किया जाता है। – dfeuer

+0

ठीक है, वह मेरा मुद्दा था। – Michael

3

यह वास्तव में पाइप के मुकाबले ज्यादा सामान्य बात है। () और XHask श्रेणी (और श्रेणियों की Hask से प्राप्त) के initial and terminal objects हैं, जिसका अर्थ है कि सभी हास्केल प्रकार a के लिए ,

  • वहाँ वास्तव में मौजूद है एक आकारिता a ->() (अर्थात् const())
  • बिल्कुल एक morphism मौजूद है X -> a (अर्थात् absurd)।

परिणामस्वरूप, कार्यों a ->() >>>() -> b वास्तव में बाएं हिस्से पर निर्भर नहीं कर सकते हैं (के बाद से a ->() कोई जानकारी वहन) के किसी भी श्रृंखला, और किसी भी श्रृंखला a -> X >>>X -> b पर निर्भर नहीं रह सकते सही हिस्साउस अर्थ में, () -> b इनपुट बंद है, और इसलिए a -> X आउटपुट है।

+2

लेकिन पाइप काम नहीं कर रहे हैं। एक पाइप उत्पादन के बिना उपभोग कर सकते हैं, उपभोग किए बिना उत्पादन कर सकते हैं, या यहां तक ​​कि बिना किसी काम किए प्रभाव डाल सकते हैं। मुझे नहीं लगता कि गैर-पहचान मोनैड पर पाइप की श्रेणी में प्रारंभिक या अंतिम वस्तुएं होने की संभावना है। – dfeuer

+0

किसी भी दो प्रकार के 'ए' और 'बी' के लिए," अधिक "पाइप होंगे जो' ए 'का उपभोग करेंगे और' ए '> बी' के मुकाबले' बी 'का उत्पादन करेंगे। – dfeuer

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