2015-09-24 2 views
8

मान लीजिए कि मैं सभी संख्याओं को Monoid का उदाहरण बनाना चाहता हूं। इस प्रकार की प्रत्येक Num के लिए एक उदाहरण बनाने के लिए होने का:क्या आप कक्षा के उदाहरण को किसी प्रकार के लिए नहीं बल्कि हास्केल में पूरी कक्षा के लिए कर सकते हैं?

instance Monoid Int where 
    mappend = (+) 
    mempty = 0 

instance Monoid Float where 
    mappend = (+) 
    mempty = 0.0 

-- etc 

वहाँ कुछ इस तरह है?

instance Num t => Monoid t where 
    mappend = (+) 
    mempty = 0 

संपादित

कुछ GHC एक्सटेंशन के साथ जवाब देने और संभावित मुद्दों के बारे में चेतावनी कर रहे हैं; मैंने पाया कि सूचनात्मक, लेकिन मुझे लगता है कि मैं Sum, Product और जो भी coerce करता है, के साथ रहूंगा।

+6

जो आप खोज रहे हैं वह पहले से ही है - लेकिन संख्याओं के लिए एक से अधिक संभव मोनोइड्स हैं - यही कारण है कि यह 'Sum' और' product' ([डेटा देखें। मॉनिइड] (https: //hackage.haskell) के लिए है .org/package/base-4.8.1.0/दस्तावेज़/डेटा-मोनॉयड.html # टी: मोनॉयड)) – Carsten

+1

@ करस्टेन तो अब मुझे 'Sum' के बारे में पता है, मैं यह कर सकता हूं:' mconcat ([1,2] :: Sum Int) ', जो अच्छा है, लेकिन मैं 'mconcat ([1,2] :: Sum Float) नहीं कर सकता, न ही' mconcat ([1,2] :: Sum frractional)'। 'फ्लोट' और 'डबल' के लिए 'Sum' का उपयोग करने का उचित तरीका क्या है? –

+0

मुझे कोई संकेत नहीं है कि आपको काम करने वाले पहले व्यक्ति को कैसे मिला - लेकिन 'मोनकैट ([1,2] :: [Sum Float])' मेरे लिए ठीक काम करता है;) – Carsten

उत्तर

21

मैं इसे विशेष रूप से Monoid और Num के बजाय सामान्य आधार के बारे में पूछने के रूप में व्याख्या कर रहा हूं।

शायद भाषा एक्सटेंशन फ्लेक्सिबल इंस्टेंस, अपरिहार्य इंस्टेंस, और ओवरलैपिंग इंस्टेंस का उपयोग करके, आप काम करने के लिए जो भी लिखते हैं, उसे प्राप्त कर सकते हैं।

लेकिन आप शायद नहीं करना चाहते करने के लिए: यह instance Num t => Monoid t where ... की तरह लगता है

कह रहा है

"अगर t Num का एक उदाहरण है, यहाँ t Monoid का एक उदाहरण बनाने के लिए कैसे है ..."

दुर्भाग्यवश, यह सही नहीं है। क्या यह वास्तव में कह रहा है और अधिक

तरह

इस प्रकार, यदि आप एक उदाहरण घोषणा लिखना "यहाँ tMonoid. पहले का एक उदाहरण बनाने के लिए कैसे करने के लिए, यह आवश्यक है कि tNum। अगला का एक उदाहरण हो सकता है ... है" इस तरह, आप किसी अन्य घटना घोषणाओं को नहीं लिख सकते हैं। (कम से कम OverlappingInstances के बिना नहीं, जो अपनी ही मुद्दों लाना होगा।)

6

GHC कुछ भाषा एक्सटेंशन के साथ अपनी परिभाषा सक्षम

{-# LANGUAGE FlexibleInstances, UndecidableInstances #-} 

instance Num t => Monoid t where 
    mappend = (+) 
    mempty = 0 

यह 5 में 2 <> 3 परिणाम बनाता अनुमति देता है। Overlapping instances for Monoid [Char]

तो, मुझे लगता है कि कम जवाब है:: कोई

लेकिन यह अन्य Monoid उदाहरणों के साथ ओवरलैप हो, तो मूल्यांकन करने के लिए "Hello" <> "World" परिणाम एक त्रुटि के साथ की कोशिश कर रहा।

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