यह Applicative
और Monad
के बीच मुख्य अंतर अर्थ पर ध्यान देने लायक हो सकता है, यह निर्धारित करने के लिए जब प्रत्येक उचित है में। प्रकारों की तुलना करें:
(<*>) :: m (s -> t) -> m s -> m t
(>>=) :: m s -> (s -> m t) -> m t
<*>
लागू करने के लिए, आप दो संगणना, एक समारोह में से एक, एक तर्क के अन्य, तो उनके मूल्यों आवेदन के द्वारा संयोजित किया जाता है चुनें। >>=
को तैनात करने के लिए, आप एक गणना चुनते हैं, और आप समझाते हैं कि आप अगले गणना का चयन करने के लिए अपने परिणामी मूल्यों का उपयोग कैसे करेंगे।यह "बैच मोड" और "इंटरैक्टिव" ऑपरेशन के बीच का अंतर है।
यह पार्स की बात आती है, Applicative
(Alternative
देने के लिए विफलता और विकल्प के साथ विस्तारित) विषय से मुक्त अपने व्याकरण के पहलुओं कैप्चर करता है। आपको अतिरिक्त शक्ति की आवश्यकता होगी Monad
आपको केवल तभी देता है जब आपको अपने इनपुट के किसी हिस्से के लिए किस व्याकरण का उपयोग करना चाहिए, यह तय करने के लिए आपको अपने इनपुट के हिस्से से पार्स पेड़ का निरीक्षण करने की आवश्यकता है। उदाहरण के लिए, आप प्रारूप डिस्क्रिप्टर, फिर उस प्रारूप में एक इनपुट पढ़ सकते हैं। मोनैड की अतिरिक्त शक्ति के आपके उपयोग को कम करने से आपको पता चलता है कि कौन सी मूल्य-निर्भरता आवश्यक है।
पार्सिंग से समांतरता तक स्थानांतरण, >>=
का उपयोग करने का यह विचार केवल आवश्यक मूल्य-निर्भरता के लिए लोड को फैलाने के अवसरों के बारे में स्पष्टता देता है। जब दो कंप्यूटेशंस <*>
के साथ संयुक्त होते हैं, तो न तो दूसरे की प्रतीक्षा करनी पड़ती है। आवेदक-कब-आप-लेकिन-मोनैडिक-जब-आप-गति-गति के लिए सूत्र होना चाहिए। ApplicativeDo
का बिंदु कोड के निर्भरता विश्लेषण को स्वचालित करना है जो मोनैडिक शैली में लिखा गया है और इस प्रकार गलती से अपरिवर्तनीय है।
आपका प्रश्न कोडिंग शैली से भी संबंधित है, जिसके बारे में राय अलग-अलग हैं। लेकिन मुझे आपको एक कहानी बताने दो। मैं मानक एमएल से हास्केल आया, जहां मुझे प्रत्यक्ष शैली में कार्यक्रम लिखने के लिए प्रयोग किया जाता था, भले ही उन्होंने शरारती चीजें जैसे अपवाद या उत्परिवर्तन संदर्भों को किया। मैं एमएल में क्या कर रहा था? अल्ट्रा-शुद्ध प्रकार सिद्धांत के कार्यान्वयन पर कार्य करना (जिसे कानूनी कारणों से नामित नहीं किया जा सकता है)। में काम करते समय सिद्धांत टाइप करते हैं, मैं प्रत्यक्ष-शैली प्रोग्राम नहीं लिख सकता जो अपवादों का उपयोग करता था, लेकिन मैंने आवेदक संयोजकों को यथासंभव प्रत्यक्ष शैली के करीब पहुंचने के तरीके के रूप में पकाया।
जब मैं हास्केल में गया, तो मुझे यह पता लगाने के लिए डर था कि किस हद तक लोगों को लगता है कि छद्म अनिवार्य रूप से अध्यापन में प्रोग्रामिंग केवल मामूली अर्थपूर्ण अशुद्धता के लिए सजा थी (बेशक, गैर-समाप्ति से)। मैंने आवेदक संयोजकों को स्टाइल पसंद के रूप में अपनाया (और "मुहावरे ब्रैकेट्स" के साथ सीधी शैली के करीब भी चला गया) इससे पहले कि मुझे अर्थात् भेदभाव की समझ हो, यानी, उन्होंने मोनैड इंटरफेस के उपयोगी कमजोर पड़ने का प्रतिनिधित्व किया। मैंने अभी तक (और अभी भी नहीं) जिस तरह से किया गया है, अभिव्यक्ति संरचना के विखंडन और चीजों का मुफ्त नामकरण की आवश्यकता है।
ऐसा कहने के लिए, वही चीजें जो कार्यात्मक कोड को अधिक कॉम्पैक्ट और अनिवार्य कोड से पठनीय बनाती हैं, आवेदक शैली को अधिक कॉम्पैक्ट और डॉकेशन से पठनीय बनाती है। मैं सराहना करता हूं कि ApplicativeDo
अधिक आवेदक बनाने के लिए एक शानदार तरीका है (और कुछ मामलों में इसका मतलब तेज) प्रोग्राम जो मोनैडिक शैली में लिखे गए थे, जिनके पास आपके पास रिफैक्टर करने का समय नहीं है। लेकिन अन्यथा, मैं आवेदक का तर्क दूंगा-जब-आप-कर सकते हैं-लेकिन-मोनैडिक-जब-आपको-यह भी देखना चाहिए कि क्या हो रहा है।
मेरी सिफारिश है कि मोनाडिक डू-नोटेशन का उपयोग करके पार्ससी का उपयोग कैसे करें। फिर जब आप आवेदकों के बारे में जानेंगे तो आप अपने मोनैडिक कोड के स्थान पर उनका उपयोग शुरू कर सकते हैं जहां आप कर सकते हैं। आवेदन monads की तुलना में सख्ती से कम शक्तिशाली हैं, इसलिए कुछ चीजें हो सकती हैं जो आप केवल आवेदकों के साथ नहीं कर सकते हैं।अब एक भेद कम है कि आप आवेदक के साथ आवेदक अभिव्यक्ति लिखने के लिए अधिसूचना का उपयोग करते हैं। – ErikR