[Haskell-cafe] dear traversable

wren ng thornton wren at freegeek.org
Sat Jul 31 01:45:25 EDT 2010

Ben wrote:
> dear traversable geniuses --
> i am looking for "better" implementations of
> unzipMap :: M.Map a (b, c) -> (M.Map a b, M.Map a c)
> unzipMap m = (M.map fst m, M.map snd m)

I don't think you can give a more efficient implementation using the 
public interface of Data.Map. You need to have a sort of mapping 
function that allows you to thread them together, either via 
continuations or via a primitive:

     splitMap :: (a -> (b,c)) -> Map k a -> (Map k b, Map k c)

This splitMap and the mapEither primitive could be combined:

     data Or a b = Fst a | Both a b | Snd b

     eitherOr (Left  a) = Fst a
     eitherOr (Right b) = Snd a

     mapOr :: (a -> Or b c) -> Map k a -> (Map k b, Map k c)

     mapEither f = mapOr (eitherOr . f)
     splitMap  f = mapOr (uncurry Both)

And the type of John's primitive could be prettied up:

     unionWithJoin :: (Or a b -> c) -> Map k a -> Map k b -> Map k c

Live well,

More information about the Haskell-Cafe mailing list