
On 26/05/05, oleg@pobox.com
Samuel Bronson wrote:
I was trying my hand at writing some collection classes myself and I can't figure out a good typing for map that will let me make Map an instance of my Collection class... I don't much like the head of Mapping.
How about the following:
class Collection (d k e) (k, e) => Mapping d k e where -- * Query lookup :: (Monad m) => k -> d k e -> m e
instance Ord k => Collection (M.Map k e) (k, e) where null = M.null empty = M.empty <elided>
instance Ord k => Mapping M.Map k e where lookup = M.lookup
A higher-ranked type constructor gets rid of functional dependencies. The drawback of course is trying to use something like Integer as a mapping from Int to Bool. We have to declare a wrapper
This also doesn't seem like it would work very well with making an instance for IntMap. I guess I can't have everything. What do you suggest that I do for map? What sort of class should it be in? I'd like it to be able to do (a -> b) -> [a] -> [b] and such... I had been thinking of having ((k, e) -> (k', e')) -> Map k e -> Map k' e', but now it occurs to me that changing key types doesn't make any sense.