(+)
और (++)
केवल mappend
की विशेषज्ञता हैं; क्या मैं सही हू? उन्हें क्यों चाहिए? यह बेकार नकल है क्योंकि हास्केल में इन शक्तिशाली टाइपक्लास और टाइप अनुमान हैं। मान लें कि हम (+)
और (++)
हटाते हैं और दृश्य सुविधा और टाइपिंग लाभ के लिए mappend
(+)
का नाम बदलें। कोडिंग शुरुआती के लिए अधिक सहज ज्ञान युक्त छोटे और अधिक समझ में आता होगा:हास्केल: डुप्लिकेट फ़ंक्शन (+) और (++), मैपेंड
--old and new
1 + 2
--result
3
--old
"Hello" ++ " " ++ "World"
--new
"Hello" + " " + "World"
--result
"Hello World"
--old
Just [1, 2, 3] `mappend` Just [4..6]
--new
Just [1, 2, 3] + Just [4..6]
--result
Just [1, 2, 3, 4, 5, 6]
(यह मेरे सपने में आता है।)। तीन, और शायद अधिक, एक ही चीज़ के लिए कार्य एक सुंदर भाषा के लिए एक अच्छी बात नहीं है जो हास्केल जैसे अवशोषण और सामान पर जोर देती है। fmap
एक ही है, या लगभग, के रूप में map
, (.)
, liftM
, mapM
, forM
, ... मुझे पता है कि fmap
के लिए historial कारण हैं, लेकिन क्या monoids के बारे में: मैं भी monads साथ repetitions के एक ही तरह देखा था? क्या हास्केल इस बारे में कुछ योजना बना रहा है? यह कुछ कोड तोड़ देगा, लेकिन मैंने सुना है, हालांकि मुझे यकीन नहीं है, एक आने वाला संस्करण है जिसमें बहुत अच्छे बदलाव होंगे, जो एक अच्छा अवसर है। यह बहुत दयालु है ... कम से कम, एक कांटा सस्ती है?
संपादित जवाब मैंने पढ़ा है, वहाँ तथ्य यह है कि संख्या के लिए, या तो (*)
या (+)
mappend
में फिट सकता है। वास्तव में, मुझे लगता है कि (*)
Monoid
का हिस्सा होना चाहिए! देखो:
वर्तमान में, mempty
और mconcat
कार्यों के बारे में भूलना, हमारे पास केवल mappend
है।
class Monoid m where
mappend :: m -> m -> m
लेकिन हम ऐसा कर सकते हैं:
class Monoid m where
mappend :: m -> m -> m
mmultiply :: m -> m -> m
यह (शायद, मैं नहीं है, हालांकि काफी इसके बारे में अभी तक) होगा इस प्रकार व्यवहार करते हैं:
3 * 3
mempty + 3 + 3 + 3
0 + 3 + 3 + 3
9
Just 3 * Just 4
Just (3 * 4)
Just (3 + 3 + 3 +3)
Just 12
[1, 2, 3] * [10, 20, 30]
[1 * 10, 2 * 10, 3 * 10, ...]
[10, 20, 30, 20, 40, 60, ...]
असल में 'mmultiply' केवल 'mappend' के संदर्भ में परिभाषित किया जाएगा ताकि Monoid
के उदाहरणों के लिए इसे फिर से परिभाषित करने की आवश्यकता न हो! फिर Monoid
गणित के करीब है; शायद हम कक्षा में (-)
और (/)
जोड़ सकते हैं! यदि यह काम करता है, तो मुझे लगता है कि यह Sum
और Product
के साथ-साथ फ़ंक्शंस डुप्लिकेशंस के मामले को हल करेगा: mappend
(+)
और नया mmultiply
केवल (*)
है। असल में मैं "पुल अप" के साथ कोड का एक रिफैक्टरिंग का सुझाव देता हूं। ओह, हमें (*)
के लिए एक नया mempty
भी चाहिए। हम सार एक वर्ग MonoidOperator
में इन ऑपरेटरों सकता है और इस प्रकार Monoid
को परिभाषित:
class (Monoid m) => MonoidOperator mo m where
mempty :: m
mappend :: m -> m -> m
instance MonoidOperator (+) m where
mempty = 0
mappend = --definition of (+)
instance MonoidOperator (*) where
--...
class Monoid m where
-...
खैर मैं कैसे अभी तक यह करने के लिए पता नहीं है, लेकिन मुझे लगता है कि यह सभी के लिए एक शांत समाधान है।
सैद्धांतिक रूप से, '+' और '*' 'मैपेंड 'की विशेषज्ञता हैं लेकिन व्यावहारिक रूप से वे नहीं हैं: यह विचार [न्यूम' के आसपास [पतली रैपर] के रूप में लागू किया गया है (http://www.haskell.org /ghc/docs/latest/html/libraries/base/Data-Monoid.html#g:3)। (और इसे किसी अन्य तरीके से समझदारी से लागू नहीं किया जा सकता है, एक के लिए, '+' और '*' दोनों मोनोइड ऑपरेशन के रूप में मान्य हैं और इसका उपयोग करने के लिए कोई विशिष्ट तरीका नहीं होगा।) – huon
संख्याएं 'मोनॉयड' 'उदाहरण दो अलग-अलग तरीकों से - योग और उत्पाद। वास्तव में डुप्लिकेट फ़ंक्शंस हैं, जिन्हें एक साथ विलय किया जाना चाहिए ('map',' fmap', 'liftM',' liftA'; '(<*>)' 'ap' और कई अन्य), लेकिन मुझे नहीं लगता कि 'mappend' (या '(<>)' नए संस्करणों में) उन कार्यों में से एक है जिन्हें मर्ज की आवश्यकता है। – Vitus
आप पहली पोस्ट के संपादन के बारे में क्या सोचते हैं? – L01man