टीएल; डीआर: ऐतिहासिक कारण। यह MonadPlus
में इस तरह की कल्पना की गई थी, जिसने Applicative
संस्करण Alternative
बाद में Alternative
को AZero
और AChoice
या इसी तरह विभाजित करने का प्रस्ताव दिया है।
Alternative
सिर्फ Applicative
की तरह एक अपेक्षाकृत नया विचार है। वापस guard
पहली बार कल्पना की गई थी, यह MonadPlus
पर आधारित था, Monad
जो Alternative
की तरह पसंद और विफलता का समर्थन करना चाहिए। इसका मूल प्रकार इस प्रकार
guard :: MonadPlus m => Bool -> m()
हास्केल 98 रिपोर्ट, जहां MonadPlus
पहले ही उल्लेख किया गया था में निर्दिष्ट किया गया था कि था। Haskell 1.0 रास्ते में, monads का उपयोग नहीं किया था। Applicative
को अंततः Monad
, Alternative
का सुपरक्लास मिला MonadPlus
, और mzero = empty
और mplus = (<|>)
का सुपरक्लास मिला।
अच्छा, अब हम जानते हैं कि क्यों guard
Alternative
का उपयोग करता है। क्योंकि यह पहले से MonadPlus
पर आधारित था। तो MonadPlus
इस तरह परिभाषित क्यों है?
किसी को 1 99 8 से एसपीजे या समिति से किसी और को अपना तर्क प्राप्त करने के लिए एक पत्र लिखना होगा, क्योंकि सिर्फ एक साल बाद, Erik Meijer and Graham Hutton wrote their "Monadic Parsing in Haskell" पेपर। आप कागज पर एक नजर है, तो आप देखेंगे कि उनकेMonadPlus
केवल आपके तरह काम करता है इरादा:
class Monad m => MonadZero m where
zero :: m a
class MonadZero m => MonadPlus m where
(++) :: m a -> m a -> m a
तो यह निश्चित रूप से इस "stoppable" जिस तरह से आप है संभाल करने के लिए संभव है इसका वर्णन किया। हालांकि, वहां base
कक्षा नहीं है जो वर्तमान में Alternative
के बिना empty
को परिभाषित करती है। एक हो सकता है, लेकिन यह अभी तक प्रस्तावित नहीं किया गया था।
ध्यान दें कि यह हास्केल कक्षाओं के साथ एक पुनरावर्ती विषय है। Monoid
में mappend
और mempty
शामिल हैं। इसकी धारणा के बाद, किसी ने देखा कि कुछ प्रकार हैं जहां mappend
समझ में आता है, लेकिन mempty
नहीं। उदाहरण
newtype Min a = Min a
combine :: Ord a => Min a -> Min a -> Min a
combine (Min x) (Min y) = Min (min x y)
यहाँ के लिए, mappend = combine
जबकि एक खाली Min
संभव नहीं है, तो हम सिर्फ Ord
उपयोग करें, हम Bounded
का उपयोग करना होगा, स्पष्ट रूप से साहचर्य है। यही कारण है कि अब Semigroup
है, जो अभी तक Monoid
का आधार वर्ग नहीं है, लेकिन हमें वह सहयोगी संचालन देता है।
वापस अपने मूल प्रश्न के लिए आते हैं: guard
का उपयोग करता Alternative
, क्योंकि Alternative
empty
प्रदान करता है, और empty
कुछ Alternative
के मूल्यांकन में "बंद हो जाता है"। इसमें कोई अन्य वर्ग नहीं है जिसमें अभी तक है।
लेकिन एक प्रस्ताव के साथ, कुछ बिंदु पर हो सकता है, हालांकि मुझे यकीन नहीं है कि Alternative
विभाजन पर समुदाय की राय क्या है।
वैसे, PureScript जैसी भाषाओं, Alternative
विभाजित हालांकि वे यह इसका उल्टा ...
विभाजित अधिक जानकारी के लिए के बारे में Alternative
और कारण है कि मैं एक और उदाहरण के रूप में Monoid
इस्तेमाल किया, Confused by the meaning of the 'Alternative' type class and its relationship to other type classes देखते हैं।
आपको भी 'शुद्ध' की आवश्यकता है। निश्चित रूप से, आपके पास 'शुद्ध 'श्रेणी' शुद्ध 'प्रदान कर सकती है, और' खाली' कक्षा 'खाली' प्रदान कर सकती है, और 'वैकल्पिक' दोनों की आवश्यकता होती है। व्यावहारिक कारणों के लिए, हालांकि, कोई भी कक्षा को एकल-विधि वर्गों में विभाजित नहीं करता है। – chi
इस मामले में व्यावहारिक या ऐतिहासिक कारण? – gallais
मुझे लगता है कि ऐसा इसलिए है क्योंकि ऐसे प्रकार नहीं हैं, जो 'खाली' को कार्यान्वित कर सकते हैं और '(<|>) लागू नहीं कर सकते हैं। तो, सैद्धांतिक एक प्रकार की कक्षा 'स्टॉपपेबल' 'वैकल्पिक 'के बराबर होगी (प्रकारों का सेट बराबर होगा)। – freestyle