# Monoid

Types with an associative (meaning ordering does not matter) binary (meaning of two values) operation (a combinator) that has an identity, which sometimes also called 'the unit'. (applying it changes nothing).

Identity for Addition is `0`, for Multiplication it is `1`. For concatenation of Lists it is `[]`, for String concatenation it is `""`, etc.

Basically, identity is the notion of emptiness or nothingness in a given particular context. (Multiplication is a bit tricky - `1` is at least how many times). Usually units are the base-cases of recursion (of a recursive process).

## Monoid laws

Identity

```x <> mempty = x
mempty <> x = x
```

Semigroup

```x <> (y <> z) = (x <> y) <> z
```

## Connection to Reality

There is no Monoids outside one's head. Wait! There is one...

The image you see in a mirror is an identity. An arrow to yourself.

```you <> mirror = you
mirror <> you = you
```

But there is a problem with an associative binary operation... The one we all know is, strictly speaking, not associative.

To be a Monoid is to implement `mappend` and `mempty` which conform to Monoid laws.

```class Semigroup a => Monoid a where
mempty  :: a

mappend :: a -> a -> a
mappend = (<>)
```