2011-03-17 8 views
12

मैं जा रहा किया गया है में हो सकता है कि का उपयोग कर monoid Haskell monoids and their uses के माध्यम से है, जो मुझे monoids की मूल बातें के एक काफी अच्छी समझ दे दी है। ब्लॉग पोस्ट में शुरू की गई चीज़ों में से एक किसी भी monoid है, और यह निम्नलिखित की तरह उपयोग है:लिखें अधिकतम हास्केल

foldMap (Any . (== 1)) tree 
foldMap (All . (> 1)) [1,2,3] 

एक समान नस में, मैं एक अधिकतम monoid का निर्माण करने की कोशिश कर रहे हैं और निम्नलिखित के साथ आए हैं :

newtype Maximum a = Maximum { getMaximum :: Maybe a } 
     deriving (Eq, Ord, Read, Show) 

instance Ord a => Monoid (Maximum a) where 
     mempty = Maximum Nothing 
     [email protected](Maximum (Just x)) `mappend` Maximum Nothing = m 
     Maximum Nothing `mappend` y = y 
     [email protected](Maximum (Just x)) `mappend` [email protected](Maximum (Just y)) 
      | x > y = m 
      | otherwise = n 

मैं एक विशिष्ट प्रकार के लिए एक अधिकतम monoid का निर्माण कर सकते हैं - काफी आसानी से उदाहरण के लिए कहते हैं कि अंक,, लेकिन यह कुछ भी (स्पष्ट आवश्यकता है कि कुछ भी Ord का एक उदाहरण है) के साथ के लिए उपयोगी होना चाहता हूँ।

इस बात मेरी कोड संकलित पर है, लेकिन वह इसके बारे में है। अगर मैं इसे चलाने के लिए कोशिश मैं इस मिल:

> foldMap (Just) [1,2,3] 

<interactive>:1:20: 
    Ambiguous type variable `a' in the constraints: 
     `Num a' arising from the literal `3' at <interactive>:1:20 
     `Monoid a' arising from a use of `foldMap' at <interactive>:1:0-21 
    Probable fix: add a type signature that fixes these type variable(s) 

मुझे यकीन है कि अगर इस वजह से मैं गलत यह फोन कर रहा हूँ, या नहीं कर रहा हूँ क्योंकि मेरे monoid गलत है, या दोनों है। मैं (, के रूप में मैं बहुत भाषा के लिए नया हूँ दोनों तार्किक त्रुटियों और गैर मुहावरेदार हास्केल उपयोग के संदर्भ में) जहां मैं गलत जा रहा हूँ पर कोई भी मार्गदर्शन की सराहना करेंगे।

- संपादित करें -

पॉल जॉनसन, नीचे एक टिप्पणी में, हो सकता है कि बाहर छोड़ने सुझाव दिया। मेरा पहला प्रयास इस तरह दिखता है:

newtype Minimum a = Minimum { getMinimum :: a } 
     deriving (Eq, Ord, Read, Show) 

instance Ord a => Monoid (Minimum a) where 
     mempty = ?? 
     [email protected](Minimum x) `mappend` [email protected](Minimum y) 
      | x < y  = m 
      | otherwise = n 

लेकिन मैं स्पष्ट नहीं कैसे जानते हुए भी क्या एक की mempty मूल्य होना चाहिए बिना mempty व्यक्त करने के लिए कर रहा हूँ। मैं इसे कैसे सामान्य कर सकता हूं?

+0

मैं देख रहा हूँ कि यह कैसे काम करता है, लेकिन क्यों "शायद एक" अंदर अधिकतम प्रकार है? यदि आपने अभी "अधिकतम ए" कहा है तो यह आपके उदाहरण को सरल बनाता है। "शायद एक" Ord का एक उदाहरण के रूप में "एक" है है, तो आप सिर्फ कह सकते हैं "अधिकतम (हो सकता है कि पूर्णांक)" और यह सही काम करना होगा। –

+0

@Paul जॉनसन मैं शायद बाहर छोड़ने के पीछे अपने तर्क देखते हैं, लेकिन मुझे लगता है कि व्यक्त करने के लिए कैसे पता नहीं है। मैंने उपरोक्त मेरे प्रश्न में कोड जोड़ा ताकि यह अधिक पठनीय हो। –

+2

आह, मैं आपकी समस्या को देखते हैं। यदि आपने बाधा के रूप में "बाउंड" जोड़ा है तो आप अधिकतम के लिए न्यूनतम और ऊपरी सीमा के लिए निचली सीमा को वापस कर सकते हैं। अन्यथा आप सही हैं; करने के लिए याद करने के लिए कोई सही बात नहीं है। जिसका मतलब है कि यह एक monoid नहीं है। –

उत्तर

12

समारोह foldMap के लिए पारित एक monoid वापस जाने के लिए, टाइप करें Maximum a की इस मामले में की जरूरत है:

> foldMap (Maximum . Just) [1,2,3] 
Maximum {getMaximum = Just 3} 
+0

अब जब आप इसे इंगित करते हैं, तो यह बहुत स्पष्ट लगता है :) आपके उत्तर के लिए धन्यवाद! –

+1

एला 'अधिकतम फोल्डमैप बस [1,2,3] = बस 3 - अधिकतम के उचित न्यूटाइप उदाहरण को देखते हुए। इस पैकेज से: http://hackage.haskell.org/package/newtype –