Add foldMapM to Data.Foldable

Andrew Martin andrew.thaddeus at
Thu Dec 7 00:27:43 UTC 2017

I had not considered that. I tried it out on a gist (, and
you're definitely right. I don't understand right monadic folds well enough
to write those out, but it would probably be worthwhile to both variants of
it as well. Here's the code from the gist:

{-# LANGUAGE ScopedTypeVariables #-}

module Folds where

import Control.Applicative

-- Lazy in the monoidal accumulator.
foldlMapM :: forall g b a m. (Foldable g, Monoid b, Applicative m) => (a ->
m b) -> g a -> m b
foldlMapM f = foldr f' (pure mempty)
  f' :: a -> m b -> m b
  f' x y = liftA2 mappend (f x) y

-- Strict in the monoidal accumulator. For monads strict
-- in the left argument of bind, this will run in constant
-- space.
foldlMapM' :: forall g b a m. (Foldable g, Monoid b, Monad m) => (a -> m b)
-> g a -> m b
foldlMapM' f xs = foldr f' pure xs mempty
  f' :: a -> (b -> m b) -> b -> m b
  f' x k bl = do
    br <- f x
    let !b = mappend bl br
    k b

On Wed, Dec 6, 2017 at 6:11 PM, David Feuer <david.feuer at> wrote:

> It seems this lazily-accumulating version should be Applicative, and a
> strict version Monad. Do we also need a right-to-left version of each?
> On Dec 6, 2017 9:29 AM, "Andrew Martin" <andrew.thaddeus at> wrote:
> Several coworkers and myself have independently reinvented this function
> several times:
>     foldMapM :: (Foldable g, Monoid b, Monad m) => (a -> m b) -> g a -> m b
>     foldMapM f xs = foldlM (\b a -> mappend b <$> (f a)) mempty xs
> I would like to propose that this be added to Data.Foldable. We have the
> triplet foldr,foldl,foldMap in the Foldable typeclass itself, and
> Data.Foldable provides foldrM and foldlM. It would be nice to provide
> foldMapM for symmetry and because it seems to be useful in a variety of
> applications.
> --
> -Andrew Thaddeus Martin
> _______________________________________________
> Libraries mailing list
> Libraries at

-Andrew Thaddeus Martin
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <>

More information about the Libraries mailing list