[Haskell-cafe] foldMap for semigroups

coot at coot.me coot at coot.me
Sat May 15 07:38:02 UTC 2021


Thanks Oleg, I would love to see `Foldable1` to be in base.

This seems to be a topic that comes back again and again, so I am not sure why there's a lack of decision so far.

There is a whole ecosystem of non empty data types: `nonempty-containers`, `nonempty-vector`, `nonempty-dlist`, `nonempty-lift` and the most funny one `Identity` from `base` - the nonempty `Maybe` ;).  For all of them `Foldable1` instance are non partial. Isn't this a good enough argument to move `Foldable1` to base?

Maybe this could go through HF to help facilitate the decision?

My recent discovery why I'd like to have it is a last-to-finish synchronisation which is a semigroup:
https://github.com/input-output-hk/ouroboros-network/blob/coot/last-to-finish-stm/ouroboros-network-framework/src/Data/Monoid/Synchronisation.hs#L85
There's also last-to-finish based on `Ap`.  The `LastToFinish m a` does not require Monoid instance on `a`, unlike `Ap a`, so it is easier to use, but it requires `foldMap1` which is not in `base`.

Cheers,
Marcin

Sent with ProtonMail Secure Email.

‐‐‐‐‐‐‐ Original Message ‐‐‐‐‐‐‐

On Friday, May 14th, 2021 at 23:11, Henning Thielemann <lemming at henning-thielemann.de> wrote:

> On Fri, 14 May 2021, coot at coot.me wrote:
> 

> > Base has:
> > 

> > -   foldMap :: (Foldable t, Monoid a) => (x -> a) -> t x -> a
> > -   foldr1 :: (Foldable t) => (a -> a -> a) -> t x -> a
> >     

> >     Is there a good reason why it does not have:
> > 

> >     foldMap1 :: (Foldable t, Semigroup a, Functor f) => (a -> a) -> t x -> a
> >     foldMap1 = fodlr1 (<>) . fmap f
> >     

> > 

> > Like `foldr1` it is partial for any foldable that can be empty.
> 

> I do not think we should extend support for partial functions.
> 

> foldMap1 should be restricted to non-empty Foldable (i.e. Foldable1).
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 509 bytes
Desc: OpenPGP digital signature
URL: <http://mail.haskell.org/pipermail/haskell-cafe/attachments/20210515/9a4a17f0/attachment.sig>


More information about the Haskell-Cafe mailing list