Proposal: Non-allocating way to iterate over a Data.Map: traverseWithKey_
Henning Thielemann
lemming at henning-thielemann.de
Tue Jul 2 20:45:49 CEST 2013
On Tue, 2 Jul 2013, Ryan Newton wrote:
> If there's not an existing way to do this, I suppose this is a minor proposal.
> When writing monadic code that consumes a container (Set, Map) etc, I often find that I just want what
> iterators in imperative languages provide: that is, to iterate over the contents of a large container,
> performing monadic effects along the way, but without allocating.
>
> The Foldable instance for Data.Map almost gives you what you want, but it only exposes the values, not their
> keys. The "traverseWithKey" function is close too, but it builds a new Map as output:
>
> traverseWithKey :: Applicative t => (k -> a -> t b) -> Map k a -> t (Map k b)
>
> So in practice what I do, and what I assume others do is this:
>
> mapM_ f (toList myMap)
You could also do
Map.foldrWithKey (\k a -> f k a >>) (return ())
which does not need an interim Map, or
Foldable.sequence_ . Map.mapWithKey f
which looks more elegant.
More information about the Libraries
mailing list