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?
Chỉ cần đặt 'Ord' vào ngữ cảnh:' instance Ord k => Functor '(Map.Map k) trong đó'. – JJJ
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
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