2017-06-22 6 views
6

guardAlternative पर आधारित क्यों है?'वैकल्पिक' पर आधारित 'गार्ड' क्यों है?

guard :: Alternative f => Bool -> f() 
-- guard b is pure() if b is True, 
-- and empty if b is False. 

मैं पूछता हूँ क्योंकि guard केवल Alternative से empty उपयोग करता है। यह Alternative से <|> का उपयोग नहीं करता है। तो पहली जगह Alternative का उपयोग क्यों परेशान करते हैं?

मुझे लगता है कि यह है क्योंकि वहाँ के पीछे Alternative के empty है कि हम क्या guard (False पर रोक, True पर जारी) के साथ पूरा करने के लिए कोशिश कर रहे हैं के साथ पूरी तरह से मेल खाता है कुछ अनकहा विचार। यदि ऐसा है, तो कृपया मुझे इस अस्थिर विचार के बारे में जानकारी दें।

फिर भी, अगर ऐसा लगता है कि हम केवल <|> को अनदेखा कर रहे हैं। ऐसा लगता है कि guardAlternative क्या है "पूरी तरह से कैप्चरिंग" नहीं है। मुझे उम्मीद है कि इसका कोई अर्थ है। इसे और अधिक ठोस बनाने के लिए: उन्होंने Stoppable (या Abortable) जैसे किसी अन्य प्रकार की कक्षा का आविष्कार क्यों नहीं किया और Alternative के बजाय इसका उपयोग किया?

+2

आपको भी 'शुद्ध' की आवश्यकता है। निश्चित रूप से, आपके पास 'शुद्ध 'श्रेणी' शुद्ध 'प्रदान कर सकती है, और' खाली' कक्षा 'खाली' प्रदान कर सकती है, और 'वैकल्पिक' दोनों की आवश्यकता होती है। व्यावहारिक कारणों के लिए, हालांकि, कोई भी कक्षा को एकल-विधि वर्गों में विभाजित नहीं करता है। – chi

+1

इस मामले में व्यावहारिक या ऐतिहासिक कारण? – gallais

+1

मुझे लगता है कि ऐसा इसलिए है क्योंकि ऐसे प्रकार नहीं हैं, जो 'खाली' को कार्यान्वित कर सकते हैं और '(<|>) लागू नहीं कर सकते हैं। तो, सैद्धांतिक एक प्रकार की कक्षा 'स्टॉपपेबल' 'वैकल्पिक 'के बराबर होगी (प्रकारों का सेट बराबर होगा)। – freestyle

उत्तर

8

टीएल; डीआर: ऐतिहासिक कारण। यह 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 = (<|>) का सुपरक्लास मिला।

अच्छा, अब हम जानते हैं कि क्यों guardAlternative का उपयोग करता है। क्योंकि यह पहले से 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, क्योंकि Alternativeempty प्रदान करता है, और empty कुछ Alternative के मूल्यांकन में "बंद हो जाता है"। इसमें कोई अन्य वर्ग नहीं है जिसमें अभी तक है।

लेकिन एक प्रस्ताव के साथ, कुछ बिंदु पर हो सकता है, हालांकि मुझे यकीन नहीं है कि Alternative विभाजन पर समुदाय की राय क्या है।

वैसे, PureScript जैसी भाषाओं, Alternative विभाजित हालांकि वे यह इसका उल्टा ...

विभाजित अधिक जानकारी के लिए के बारे में Alternative और कारण है कि मैं एक और उदाहरण के रूप में Monoid इस्तेमाल किया, Confused by the meaning of the 'Alternative' type class and its relationship to other type classes देखते हैं।

+1

मैं नहीं कहूंगा कि यह एक निरीक्षण है, प्रति से। ग्रैन्युलरिटी और समेकन के बीच एक कानूनी डिजाइन ट्रेडऑफ है। मैं व्यक्तिगत रूप से कुछ हद तक PaskScript एक के लिए हास्केल वर्ग पदानुक्रम पसंद करते हैं। एक खाली तरीके से 'खाली 'और' <|> '" एक साथ जाएं "। –

+1

@ बेंजामिन होडसन मैंने निर्णय हटा दिया, यह वास्तव में उपयुक्त नहीं था। – Zeta

+1

'मोनाडफेल' के बारे में सोचने के लायक भी है, जिसका 'असफल' 'खाली 'जैसा है, लेकिन जो वसूली के बजाय' >> = 'के साथ खालीपन बढ़ाता है। – dfeuer

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