[Haskell-cafe] dear traversable
Ross Paterson
ross at soi.city.ac.uk
Sat Jul 31 06:01:11 EDT 2010
On Fri, Jul 30, 2010 at 08:13:43PM -0700, 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)
>
> unliftMap :: (Ord a) => M.Map a (b -> c) -> M.Map a b -> M.Map a c
> unliftMap mf ma = M.mapWithKey (\k v -> mf M.! k $ v) ma
>
> the first is obviously inefficient as it traverses the map twice. the
> second just seems like it is some kind of fmap.
The second one assumes that every key in ma is also in mf. A generalization
without that assumption is
unliftMap = intersectionWith id
As Wren said, it looks like a <*> operator, but in this case there's no
corresponding pure function. To make the laws work, pure x would have
to be a map that took every key to x.
More information about the Haskell-Cafe
mailing list