
On Thu, Sep 01, 2005 at 12:41:06AM -0700, Juan Carlos Arevalo Baeza wrote:
You can get the correct order by using lists, but you want to use the "Asc" versions:
myMapM someAction someMap = do list <- sequence $ map (\(k, a) -> someAction a >>= (\b -> return (k,b))) $ Map.toAscList someMap return (Map.fromAscList list)
Should also be O(n).
I like this approach. You want to use fromDistinctAscList though. By analogy with the Prelude, I would make it slightly more flexible as follows: mySequence :: Monad m => Map.Map k (m a) -> m (Map.Map k a) mySequence someMap = do list <- sequence $ map liftTuple $ Map.toAscList someMap return $ Map.fromDistinctAscList list where liftTuple (x, y) = do z <- y return (x, z) myMapM :: Monad m => (a -> m b) -> Map.Map k a -> m (Map.Map k b) myMapM f = mySequence . Map.map f myMapM_ :: Monad m => (a -> m b) -> Map.Map k a -> m () myMapM_ f = sequence_ . map f . Map.elems Regards, Yitz