Maximum and Minimum monoids

Roman Cheplyaka roma at
Fri Dec 28 11:40:20 CET 2012

* Herbert Valerio Riedel <hvr at> [2012-12-28 10:42:06+0100]
> Hi,
> Michael Snoyman <michael at> writes:
> [...]
> >> Because they're properly represented as semigroups too, just like Min and
> >> Max (i.e. they don't behave sensibly "out of the box" on empty lists). The
> >> semigroups package already provides the proper types and instances. And
> >> just like Min and Max, the semigroups package lets you "lift" its First and
> >> Last into Monoids with the Option type.
> > Just because such a lifting is possible doesn't mean that it will be
> > intuitive or obvious to new users. (I wouldn't know how to make this
> > switch, for example.)
> ...this seems to call for better documentation (including
> examples) of the Data.Semigroup.Option Monoid instance then.
> Do you have an example where it might not be obvious how to use 
>   Option (Semigroup.First a)
> instead of
>   Monoid.First a
> ?

I disagree that Monoid.First is not useful by itself.

It solves the problem when you already have a list (or another data
structure) of Maybes, and want to fold them.

Expressing this through Option and Semigroup.First would require more
code and run-time conversions.


More information about the Libraries mailing list