2012-06-22 9 views
18

जीएचसी में कुछ भाषा झंडे हैं, जैसे कि DeriveFunctor, DeriveDataTypeable इत्यादि, जो हास्केल 98 में अनुमत लोगों के अलावा अन्य प्रकार के वर्गों के लिए व्युत्पन्न उदाहरणों की कंपाइलर पीढ़ी को सक्षम बनाता है। यह विशेष रूप से Functor जैसे कुछ के लिए समझ में आता है, जहां उस वर्ग के नियम एक स्पष्ट, "प्राकृतिक" व्युत्पन्न उदाहरण निर्देशित करें।जीएचसी मोनॉयड के लिए उदाहरण क्यों नहीं प्राप्त कर सकता है?

तो Monoid के लिए क्यों नहीं? (स्यूडोकोड बहाना)

data T = MkT a b c ... 

एक यंत्रवत् एक Monoid उदाहरण उत्पादन कर सकता है:: यह एक एकल डेटा निर्माता के साथ किसी भी डेटा प्रकार के लिए की तरह लगता है

instance (Monoid a, Monoid b, Monoid c, ...) => Monoid T where 
    mempty = 
    MkT mempty mempty mempty ... 
    mappend (MkT a1 b1 c1 ...) (MkT a2 b2 c2 ...) = 
    MkT (mappend a1 a2) (mappend b1 b2) (mappend c1 c2) ... 

मुझे पता कर रहा हूँ कि derive पैकेज provides this, लेकिन मेरा सवाल विशेष रूप से यह है कि क्या कोई कारण है कि जीएचसी क्यों नहीं करता है।

+0

@sdcvvc: यह प्रश्न के वैध उत्तर की तरह लगता है। शायद आपको इसे इस तरह पोस्ट करना चाहिए? –

+0

ठीक है, मैंने जवाब दिया है। – sdcvvc

+1

'फ़ैक्टर' उदाहरण बनाने के लिए आमतौर पर केवल समझदार तरीका होता है। 'मोनॉयड 'के बारे में भी यही सच नहीं है। – augustss

उत्तर

14

यह वास्तव में एक मनमाने ढंग से निर्णय है कि Monoid प्राप्त करने में सक्षम नहीं है, लेकिन मोनोइड्स भी बहुत सामान्य हैं इसलिए आमतौर पर एक प्रकार का मोनॉयड बनाने के कई तरीके होते हैं। यहाँ एक उदाहरण है:

data T = A | B | C deriving (Eq, Ord, Enum) 

type Mon a = (a, a -> a -> a) 

m1, m2, m3, m4 :: Mon T 
m1 = (A, max) 
m2 = (C, min) 
m3 = (A, \ x y -> toEnum $ (fromEnum x + fromEnum y) `rem` 3) 
m4 = (B, f4) 
f4 A _ = A 
f4 B x = x 
f4 C _ = C 

यह (Mon इकाई और बाइनरी आपरेशन युक्त) T एक monoid बनाने के लिए चार उचित तरीके को दर्शाता है। पहला अधिकतम लेने से मोनॉयड होता है, दूसरा मोनोइड न्यूनतम लेने से, तीसरा मोनोइड मॉड्यूलो 3 अंकगणित से होता है, और चौथाई Ordering प्रकार के लिए इस्तेमाल किया जाने वाला मोनोइड होता है। प्राकृतिक तरीके के रूप में वास्तव में कुछ भी नहीं खड़ा है।

7

आप इसे Num और कुछ अन्य कक्षाओं के लिए भी पूछ सकते हैं। यह अपरिहार्य होगा: अन्य सभी मानक व्युत्पन्न एकाधिक रचनाकारों के साथ डेटा प्रकारों के लिए काम करते हैं।

एक प्रतिस्थापन के रूप में, आप newtype T = MkT (a,b,c) deriving Monoid प्राप्त करने वाले नए प्रकार का उपयोग कर सकते हैं।

इसी तरह के विस्तार: आप खाली डेटाटाइप लगभग हर प्रकार की कक्षा का एक उदाहरण बना सकते हैं।

deriving क्लॉज हमेशा हास्केल का विज्ञापन और असुविधाजनक हिस्सा था, क्योंकि यह केवल पूर्व परिभाषित कक्षाओं के लिए काम करता था। और भी अधिक विज्ञापन-विस्तार जोड़ना भाषा को जटिल करेगा। इसके बजाए, जीएचसी को हाल ही में generic deriving के लिए समर्थन मिला है।

+1

ठीक है, जैसा कि 'व्युत्पन्न' के रूप में विज्ञापन-प्रसार हो सकता है, उन्होंने अपनी शक्ति का विस्तार जारी रखा है। दोबारा, मुझे पता है कि 'मोनॉयड' प्राप्त करने के लिए वैकल्पिक तंत्र हैं; इसके बजाय मैं विशेष रूप से पूछ रहा हूं कि क्यों 'DeriveFunctor' (और अन्य) मौजूद है, जबकि 'DeriveMonoid' (और अन्य) नहीं है। क्या यह सिर्फ मनमाना है? – mergeconflict

+2

अंत में यह मनमाने ढंग से है, लेकिन प्रस्तावित विस्तार बहुत कम उपयोगी प्रतीत होता है। अधिकांश मकानों की सेवा करने के लिए एक विशेष भाषा सुविधा मेरे लिए अच्छी लगती है। उत्पाद मोनोइड्स की सेवा के लिए एक विशेष भाषा सुविधा वारंट अतिरिक्त के लिए कम लगती है। आपको दायरे के बारे में सोचना होगा (यदि 'मोनॉयड' तो क्या अन्य वर्ग?)। ध्यान दें कि उपयोगी मोनोइड्स अक्सर नए प्रकार के रैपर का उपयोग करते हैं। तो आप प्राप्त करने के उस रूप का उपयोग करने के लिए 'डेटा टी = टी (सम इंटेगर) (एंडो चार)' लिखते हैं, जो उपयोग करने के लिए थोड़ा बदसूरत है (नेस्टेड कन्स्ट्रक्टर पर मिलान करने की आवश्यकता है)। – sdcvvc

+2

बहुत सारे उपयोगी मोनोइड्स हैं जो योग प्रकार हैं, लेकिन यह कार्यान्वयन उनके किसी भी उदाहरण को प्राप्त नहीं कर सकता है।= ( –

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