Data.IntMap/IntSet inconsistencies

Ben midfield at
Tue Nov 3 18:48:10 EST 2009

while we're on the topic, i'm curious as to why there isn't a zip /
join-type method for IntMaps / IntSets.  (i use the term join in
reference to SQL.)  i have defined some in the past like

-- maybe not efficient
joinOuterWithKey f m1 m2 d1 d2 =
    M.union (M.intersectionWithKey f m1 m2)
         $ M.union
               (M.mapWithKey f1 $ m1 M.\\ m2)
               (M.mapWithKey f2 $ m2 M.\\ m1)
    where f1 k l = f k l d2
          f2 k r = f k d1 r

-- left biased
joinLeftWithKey f m1 m2 d2 =
    M.union (M.intersectionWithKey f m1 m2) (M.mapWithKey f1 $ m1 M.\\ m2)
    where f1 k a = f k a d2

-- right biased
joinRightWithKey f m1 m2 d1 =
    M.union (M.intersectionWithKey f m1 m2) (M.mapWithKey f2 $ m2 M.\\ m1)
    where f2 k b = f k d1 b

joinInnerWithKey = M.intersectionWithKey


1) these are probably not terribly efficient, as they do multiple traversals

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).

the proper implementation should be easy, and trivially generalizes
intersectionWith and friends, i believe.

or am i missing something?

best, ben

More information about the Libraries mailing list