Philippa Cowderoy wrote:
On Wed, 31 Aug 2005, Philippa Cowderoy wrote:
On Wed, 31 Aug 2005, Ben Lippmeier wrote:
I imagine this would be an absolute pain for library writers. Notice
that we get Data.Map.map but no Data.Map.mapM - or perhaps there's
some magical lifting combinator that I am not aware of?
sequence (Data.Map.map (\x -> someAction x) someMap)
Or not - I really should've at least typechecked that before sending.
Wonder how fast toList and fromList are?
"foldWithKey <#v%3AfoldWithKey> :: (k -> a -> b -> b) -> b -> Map
k a -> b" looks promising... Lemme try my hand
at it...
myMapM someAction someMap = Map.foldWithKey foldFunc (return Map.empty)
someMap
where
foldFunc k a b = do
m <- b
c <- someAction a
return (Map.insert k c m)
Definitely typechecks and works, and it is O(n) but, alas, it runs
the map in reverse order (works like a foldr, as documented).
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)
<#v%3AfoldWithKey> Should also be O(n). Please, correct me if I'm
mistaken.
JCAB