2) the types are not general enough : like zip you should be able to
take functions f : a->b->c instead of what intersectionWith forces you
to do (f: a->b->a).

According to my documentation, the type of intersectionWith is (f :: a -> b -> c). 
 
On another note, with respect to my proposed change:  I concede that it might be too general for some people.  Here's a simpler change that I'd like: to be able to project information out of a value and modify it simultaneously, so simply

alterProject :: (Maybe a -> (z, Maybe a)) -> k -> Map k a -> (z, Map k a )

for a specific key.

and perhaps something similar for the min/max operations.  I'd very much like to be able to do more general things than just min/max operations with this sort of generality -- hence the Alternative approach in my original proposal.

Louis Wasserman
wasserman.louis@gmail.com
http://profiles.google.com/wasserman.louis