A type
a is a
Monoid if it provides an associative
function (
<>) that lets you combine any two values of
type
a into one, and a neutral element (
mempty) such
that
a <> mempty == mempty <> a == a
A
Monoid is a
Semigroup with the added requirement of
a neutral element. Thus any
Monoid is a
Semigroup, but
not the other way around.
Examples
The
Sum monoid is defined by the numerical addition operator
and `0` as neutral element:
>>> import Data.Int
>>> mempty :: Sum Int
Sum {getSum = 0}
>>> Sum 1 <> Sum 2 <> Sum 3 <> Sum 4 :: Sum Int
Sum {getSum = 10}
We can combine multiple values in a list into a single value using the
mconcat function. Note that we have to specify the type here
since
Int is a monoid under several different operations:
>>> mconcat [1,2,3,4] :: Sum Int
Sum {getSum = 10}
>>> mconcat [] :: Sum Int
Sum {getSum = 0}
Another valid monoid instance of
Int is
Product It is
defined by multiplication and `1` as neutral element:
>>> Product 1 <> Product 2 <> Product 3 <> Product 4 :: Product Int
Product {getProduct = 24}
>>> mconcat [1,2,3,4] :: Product Int
Product {getProduct = 24}
>>> mconcat [] :: Product Int
Product {getProduct = 1}