[Haskell-cafe] Monadic vs "pure" style (was: pros and cons of
sta tic typing and side effects)
Juan Carlos Arevalo Baeza
jcab.lists at JCABs-Rumblings.com
Thu Sep 1 03:41:06 EDT 2005
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
<Data.Map.html#t%3AMap> 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
More information about the Haskell-Cafe
mailing list