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
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).
x <> mempty = x mempty <> x = x
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
mempty which conform to Monoid laws.
class Semigroup a => Monoid a where mempty :: a mappend :: a -> a -> a mappend = (<>)
See also Semigroup