2017-08-15 12 views
6

मैं the documentationReader monad और ReaderT मोनैड ट्रांसफॉर्मर के लिए देख रहा हूं।रीडर टीनाड ट्रांसफार्मर में * का उद्देश्य क्या है?

प्रासंगिक परिभाषाएं दी गई हैं:

newtype ReaderT k r m a :: forall k. * -> (k -> *) -> k -> * 
type Reader r = ReaderT * r Identity 

मुझे समझ नहीं आता क्या * परिभाषाओं में कर रहे हैं। विशेष रूप से मैं रीडर टीओ से आईओओ के साथ बेस मोनैड और r मूल्य पर कक्षा बाधा के रूप में एक नया मोनैड प्राप्त करने का प्रयास कर रहा हूं।

मैं क्यों ReaderT को एक चौथे इनपुट (k) है और क्या रीडर कि मूल्य के साथ कर रही है जब यह उस स्थिति में एक * डालता है यकीन नहीं है।

+6

नोट कि 'रीडर टी' के लिए स्रोत कोड 'newtype रीडर टीएम = रीडर टी {runReaderT :: r -> ma}' है। 'के' केवल' रीडर टी '(' -XPolyKinds' मॉड्यूल में सक्षम है जहां इसे परिभाषित किया गया है) की पॉली-किंडनेस पर बल देने के लिए हैडॉक द्वारा प्रलेखन में उत्पन्न होता है। – Alec

+2

"मैं आईओओ के साथ बेसर मोनैड और आर मूल्य पर एक वर्ग की बाधा के रूप में रीडर टी से एक नया मोनैड प्राप्त करने का प्रयास कर रहा हूं" - जबकि यह हल होने की तुलना में अधिक समस्याएं पैदा करने की संभावना है ('r' पर बाधा डालना मान, 'रीडर टी' से नए प्रकार के व्युत्पन्न के साथ 'आईओ' के लिए तत्काल 'एम' के साथ नहीं) मुझे नहीं लगता कि ऐसा क्यों करना 'रीडर टी' की पॉलीकिंडेड परिभाषा से बाधित होगा। @ एलेक राज्यों के रूप में, 'के' पैरामीटर हैडॉक का एक आर्टिफैक्ट है - हकीकत में, यह पूरी तरह से निहित है, और आप उस रीडर टी :: (* -> *) -> * -> * '(क्योंकि यह करता है वास्तव में उस प्रकार है)। – user2407038

+0

@ user2407038 और निकोलस आप दोनों सही हैं। बाधा से संबंधित था और अब एक उदाहरण घोषणा पर रखा गया है कि मोनड परिभाषा नहीं है। –

उत्तर

5

* मूल्यों के साथ प्रकार की तरह है: यह Int, List Int आदि जैसी चीजों के लिए खड़ा है ..

forall k मतलब है k उस तरह की जरूरी नहीं है। यह किसी भी तरह के प्रकार के लिए खड़ा है, जो केवल स्थिर चीजों के रूप में देखा जाता है जिसे आप घोषित कर सकते हैं और कुशलतापूर्वक उपयोग कर सकते हैं, लेकिन जरूरी नहीं कि रनटाइम मानों से जुड़े हों। इसका एक उदाहरण यह है कि जब आप किसी अन्य प्रकार को अतिरिक्त जानकारी के साथ 'सजाने' देना चाहते हैं: कढ़ाई के प्रकार के पास किसी भी तरह का मूल्य संलग्न करने का कोई कारण नहीं है, यह कुछ कढ़ाई प्रकार (जो आमतौर पर है) के लिए "शुद्ध" जानकारी है मान)

अधिक बस यहाँ, आप देख सकते हैं कि Reader में यह सब * लिए विशेष हो जाता है, और mIdentity इकाई के लिए विशेष है। यही वह जगह है जहां आप अपने IO मोनैड चाहते हैं।

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

(जब तक आप एक बहुत अच्छे कारण के लिए, अन्य उदाहरण बात का अनुमान लगाना, Dict में के रूप में के लिए जहाँ आप एक GADT के साथ एक क्रम मूल्य के रूप में एक typeclass गवाह पर कब्जा है, लेकिन है कि संभव है कि आप क्या करना चाहते हैं नहीं है)

+0

आप सही हैं। बाधा से संबंधित था और अब एक उदाहरण घोषणा पर रखा गया है कि मोनड परिभाषा नहीं है। –

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