
I strongly support all these changes (and agree with Milan's chocie of options), having run into many of the inconsistencies in my own code and had to write impedence matchers.
7) Improve the generality of intersectionWith. Currently the Map and IntMap define intersectionWith :: Ord k => (a -> b -> c) -> Map k a -> Map k b -> Map k c intersectionWithKey :: Ord k => (k -> a -> b -> c) -> Map k a -> Map k b -> Map k c
But the combining function is not general enough. Consider two IntMaps storing hashable elements as (hash(element), element). When intersecting elements with the same hash, the intersection can be empty.
I propose to change the type of these methods to intersectionWith :: Ord k => (a -> b -> Maybe c) -> Map k a -> Map k b -> Map k c intersectionWithKey :: Ord k => (k -> a -> b -> Maybe c) -> Map k a -> Map k b -> Map k c (and appropriately for IntMap).
Note that the combining function of differenceWith already has type `(a -> b -> Maybe a)`.
The absence of intersection with this signature has been a particular annoyance. -Jan-Willem Maessen