2015-09-02 9 views
8

तो, मैं इस समय हास्केल सीख रहा हूं, और मैं मोनॉयड की मेरी समझ की पुष्टि या डिबंक करना चाहता हूं।क्या मोनॉयड की मेरी समझ वैध है?

क्या मैं CIS194 पाठ्यक्रम पढ़ने से पता लगा है कि monoid मूल रूप से कस्टम सेट पर कस्टम बाइनरी आपरेशन परिभाषित करने के लिए "API" है।

से मैं अपने स्वयं सूचित करने के लिए कुछ और चला गया और मैं बहुत भ्रामक बात को स्पष्ट करने की कोशिश कर ट्यूटोरियल की भारी राशि पर ठोकर खाई है, तो मैं अब और नहीं तो यकीन नहीं है।

मेरे पास सभ्य गणितीय पृष्ठभूमि है, लेकिन मैं बस सभी रूपकों से उलझन में हूं और स्पष्ट हां/नहीं की तलाश में मोनोइड की मेरी समझ का उत्तर देता हूं।

+3

एक मोनोइड एक बीजगणितीय संरचना (एस) है जिसमें एक सहयोगी बाइनरी ऑपरेशन ((।): एस * एस -> एस) और एक पहचान तत्व (आईडी: एस) उस ऑपरेशन के लिए। इसे सहयोगीता के नियमों को पूरा करना होगा (यानी ए। (बी। सी) = (ए। बी) सी) और पहचान (आईडी। X = x। Id = x)। –

उत्तर

8

From Wikipedia:

सार बीजगणित में, गणित की एक शाखा, एक monoid एक भी साहचर्य द्विआधारी संचालन और एक पहचान तत्व के साथ एक बीजीय संरचना है।

मुझे लगता है कि आपकी समझ सही है। एक प्रोग्रामिंग परिप्रेक्ष्य से, मोनॉयड दो "विधियों" के साथ एक इंटरफ़ेस है जिसे कार्यान्वित किया जाना चाहिए।

आपके वर्णन से अनुपलब्ध एकमात्र टुकड़ा "पहचान" है, जिसके बिना आप Semigroup का वर्णन कर रहे हैं।

कुछ भी जो "शून्य" या "खाली" है और दो मानों को संयोजित करने का एक तरीका एक मोनॉयड हो सकता है। ध्यान देने योग्य बात यह है कि एक सेट/प्रकार को एक से अधिक तरीकों से एक मोनोइड बनाने के लिए संभव हो सकता है, उदाहरण के लिए पहचान 0, या multiplication पहचान 1 के साथ।

+0

हाँ, मैंने पाया कि नियमों के बारे में उस हिस्से को गणितीय परिभाषा से संतुष्ट करना है, लेकिन मैंने सोचा कि हास्केल में मोनोइड्स के लिए और भी अधिक हो सकता है क्योंकि मैंने पाया है कि सभी ट्यूटोरियल उन्हें आश्चर्यजनक लंबाई और रूपकों को समझाने के लिए जाते हैं। – Reygoch

+0

आपके उत्तर के लिए धन्यवाद! संक्षिप्त एवं सटीक। – Reygoch

+2

@Reygoch संकलित ट्यूटोरियल शायद मौजूद हैं क्योंकि लोग अक्सर गणित से डरते हैं, और इसलिए लेखकों को लगता है कि उन्हें मोनोइड्स को संभालने के लिए बच्चों के दस्ताने की आवश्यकता होती है क्योंकि नाम डरावना है। मोनोइड्स का एक स्पष्टीकरण जो चीजों को रहस्यमय करने की कोशिश नहीं करता है [विकीबुक्स में से एक है] (https://en.wikibooks.org/wiki/Haskell/Monoids) (अस्वीकरण: मैं वहां एक योगदानकर्ता हूं)। – duplode

5
Wolfram से

:

एक monoid एक सेट है कि एक साहचर्य द्विआधारी आपरेशन के तहत बंद कर दिया और एस में एक पहचान तत्व मैं ऐसे एस में सभी एक के लिए, आईए = ऐ एक = कि है है।

विकी से

:

सार बीजगणित में, गणित की एक शाखा, एक monoid एक भी साहचर्य द्विआधारी संचालन और एक पहचान तत्व के साथ एक बीजीय संरचना है।

इसलिए आपकी अंतर्ज्ञान कम या ज्यादा सही है।

आपको केवल यह ध्यान रखना चाहिए कि इसे हास्केल में "कस्टम सेट" के लिए परिभाषित नहीं किया गया है लेकिन एक प्रकार है। भेद छोटा है (क्योंकि टाइप सिद्धांत में प्रकार सेट सिद्धांत में सेट के समान होते हैं) लेकिन जिन प्रकारों के लिए आप एक मोनॉयड इंस्टेंस को परिभाषित कर सकते हैं, उन प्रकारों की आवश्यकता नहीं होती है जो गणितीय सेट का प्रतिनिधित्व करते हैं।

दूसरे शब्दों में: एक प्रकार उस प्रकार के सभी मानों के सेट का वर्णन करता है।मोनॉयड एक "इंटरफ़ेस" है जो बताता है कि उस इंटरफ़ेस का पालन करने का दावा करने वाले किसी भी प्रकार को एक पहचान मान प्रदान करना चाहिए, उस प्रकार के दो मानों को जोड़कर एक बाइनरी ऑपरेशन प्रदान करना चाहिए, और कुछ समीकरण हैं जो इन सभी सामान्य मोनोइड ऑपरेशंस के लिए संतुष्ट होना चाहिए इरादे के रूप में कार्य करें (जैसे मोनोइड मूल्यों की सूची का सामान्य सारांश) और अजीब/असंगत नतीजे उत्पन्न नहीं करते हैं।

साथ ही, ध्यान दें कि उस सेट (प्रकार) में पहचान तत्व का अस्तित्व किसी प्रकार के लिए मोनॉयड क्लास का उदाहरण होना आवश्यक है। (पहचान = 0)

उदाहरण के लिए, प्राकृतिक संख्या दोनों इसके तहत एक monoid फार्म:

0 + n = n 
n + 0 = n 

के साथ-साथ गुणा (पहचान = 1):

1 * n = n 
n * 1 = n 

भी सूचियों एक monoid फार्म ++ के तहत (पहचान = []):

[] ++ xs = xs 
xs ++ [] = xs 

भी प्रकार a -> a के कार्यों रचना के तहत एक monoid (पहचान = id) फार्म

id . f = f 
f . id = f 

इसलिए यह महत्वपूर्ण है ध्यान रखें कि monoid प्रकार है कि सेट का प्रतिनिधित्व करता है के बारे में है, लेकिन प्रकार के बारे में जब सेट के रूप में देखा नहीं है में रखने के लिए, बोलूं तो।


एक malconstructed monoid उदाहरण के उदाहरण के रूप

, पर विचार करें:

import Data.Monoid 

newtype MyInt = MyInt Int deriving Show 

instance Monoid MyInt where 
    mempty = MyInt 0 
    mappend (MyInt a) (MyInt b) = MyInt (a * b) 

अगर आप अब mconcat को MyInt मानों की सूची की कोशिश, तो आप हमेशा परिणाम के रूप में MyInt 0 मिलेगा क्योंकि पहचान मूल्य 0 और बाइनरी आपरेशन * अच्छी तरह से एक साथ नहीं खेलते हैं:

λ> mconcat [MyInt 1, MyInt 2] 
MyInt 0 
3

पर एक मूल स्तर जो आप सही हैं - यह केवल एक बाइनरी ऑपरेटर के लिए एक एपीआई है जिसे हम <> द्वारा दर्शाते हैं।

हालांकि, मोनॉयड अवधारणा का मूल्य अन्य प्रकारों और वर्गों के संबंध में है। सांस्कृतिक रूप से हमने फैसला किया है कि <> एक ही प्रकार की दो चीजों को एक साथ जोड़ने/जोड़ने का प्राकृतिक तरीका है।

इस उदाहरण पर विचार:

{-# LANGUAGE OverloadedStrings #-} 

import Data.Monoid 

greet x = "Hello, " <> x 

समारोह greet अत्यंत बहुरूपी है - x बस कुछ ही नाम के लिए संभावनाओं एक स्ट्रिंग, ByteString या पाठ हो सकता है। इसके अलावा, इन मामलों में से प्रत्येक में यह मूल रूप से आप इसकी अपेक्षा करते हैं - यह x स्ट्रिंग `हैलो," में जोड़ता है।

इसके अतिरिक्त, बहुत सारे एल्गोरिदम हैं जो जमा किए जा सकने वाले किसी भी चीज़ पर काम करेंगे, और वे एक मोनॉयड को सामान्यीकरण के लिए अच्छे उम्मीदवार हैं।उदाहरण के लिए Foldable वर्ग से foldMap समारोह पर विचार करें:

foldMap :: Monoid m => (a -> m) -> t a -> m 

इतना ही नहीं foldMap एक संरचना पर तह के विचार सामान्य है, लेकिन मैं सामान्यीकरण कर सकते हैं कि संचय सही monoid उदाहरण प्रतिस्थापन द्वारा किया जाता है।

अगर मैं एक तह संरचना t Ints युक्त है, मैं foldMapSum monoid साथ Ints की राशि प्राप्त करने के लिए उत्पाद, आदि

अंत में प्राप्त करने के लिए उपयोग कर सकते हैं, या Product साथ, <> सुविधा का उपयोग कर मिलता । उदाहरण के लिए, विभिन्न सेट कार्यान्वयन की एक बहुतायत है, लेकिन उनमें से सभी के लिए s <> t हमेशा दो सेट s और t (उसी प्रकार के) का संघ है। यह मुझे कोड लिखने में सक्षम बनाता है जो सेट के अंतर्निहित कार्यान्वयन के अज्ञेयवादी है जिससे मेरे कोड को सरल बना दिया जा सके। कई अन्य डेटा संरचनाओं के लिए भी यही कहा जा सकता है, उदा। अनुक्रम, पेड़, मानचित्र, प्राथमिकता कतार, आदि

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