2012-06-29 21 views
6

मैं डेटा.मैप.मैप पर फ़ंक्शन एफएमएपी को कार्यान्वित करने का प्रयास कर रहा हूं, लेकिन मुझे एक त्रुटि मिल रही है। मुझे यकीन है कि इस काम को प्राप्त करने के लिए मुझे मानचित्र को सूची में बदलने की आवश्यकता नहीं है, लेकिन यह अब तक का सबसे अच्छा है।"डेटा पर फ़ैक्टर को कार्यान्वित करते समय" ऑर्ड के लिए कोई उदाहरण नहीं "। मैप.मैप

class Functor' f where 
    fmap' :: (a -> b) -> f a -> f b 

instance Functor' (Map.Map k) where 
    fmap' f m 
     | Map.null m = Map.empty 
     | otherwise = let x:xs = Map.toList m 
          mtail = Map.fromList xs 
          a = fst x 
          b = snd x 
         in Map.insert a (f b) (fmap f mtail) 

त्रुटि:

No instance for (Ord k) 
    arising from a use of `Map.fromList' 
In the expression: Map.fromList xs 
In an equation for `mtail': mtail = Map.fromList xs 
In the expression: 
    let 
    x : xs = Map.toList m 
    mtail = Map.fromList xs 
    a = fst x 
    .... 
    in Map.insert a (f b) (fmap f mtail) 

कोई भी विचार?

+3

बस 'ऑर्ड' संदर्भ में रखें: 'उदाहरण Ord k => Functor' (Map.Map k) जहां '। – JJJ

+0

अच्छा, धन्यवाद! क्या सूची में और उससे कनवर्ट करने से बेहतर तरीका है? – pyrospade

+0

हां, सूचियों और 'ऑर्ड के' बाधा का उपयोग किए बिना 'फंक्टर (मानचित्र के)' के लिए 'fmap' लिखने का एक बेहतर तरीका है। इस प्रकार 'Data.Map.map' ('=' 'के लिए ==' fmap') काम करता है: http://www.haskell.org/ghc/docs/latest/html/libraries/containers-0.4.2.1/ src/डेटा-Map.html # नक्शा। लेकिन अगर आप 'toList' /' से list' का उपयोग करना चाहते हैं तो कुछ 'fmap' f = Map.fromList जैसे कुछ। मानचित्र (दूसरा एफ)। Map.toList' सरल होगा ('दूसरा'' Control.Arrow' से है)। – JJJ

उत्तर

2

त्रुटि ऑर्ड को टाइप-वेरिएबल के लिए आवंटित करने के कारण नहीं है। बस यह करें:

instance Ord k => Functor' (Map.Map k) where