2012-06-29 27 views
6

Tôi đang cố gắng triển khai Fmaptor Functor trên Data.Map.Map, nhưng tôi gặp lỗi. Tôi chắc rằng tôi không cần phải chuyển đổi Bản đồ sang và từ một Danh sách để làm việc này, nhưng đây là điều tốt nhất tôi đã đưa ra cho đến nay."Không có trường hợp nào cho (Ord k)" khi triển khai Functor trên Data.Map.Map

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) 

Lỗi:

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) 

Bất kỳ ý tưởng?

+3

Chỉ cần đặt 'Ord' vào ngữ cảnh:' instance Ord k => Functor '(Map.Map k) trong đó'. – JJJ

+0

Rất tốt, cảm ơn bạn! Có cách nào tốt hơn chuyển đổi sang và từ Danh sách không? – pyrospade

+0

Vâng, có một cách tốt hơn để viết 'fmap' cho' Functor (Map k) 'mà không sử dụng danh sách và ràng buộc' Ord k'. Đây là cách 'Data.Map.map' (==' fmap' cho 'Map k') hoạt động: http://www.haskell.org/ghc/docs/latest/html/libraries/containers-0.4.2.1/ src/Data-Map.html # map. Nhưng nếu bạn muốn sử dụng 'toList' /' fromList' thì một cái gì đó như 'fmap 'f = Map.fromList. bản đồ (f thứ hai). Map.toList' sẽ đơn giản hơn ('second' là từ' Control.Arrow'). – JJJ

Trả lời

2

Lỗi là do không gán biến vị ngữ Ord cho biến kiểu k. Chỉ cần làm điều này:

instance Ord k => Functor' (Map.Map k) where 
Các vấn đề liên quan