Lenses allow you to use fields of the state of a state monad as if they were variables in an imperative language.
use is used to retrieve the value of a variable, and .= and %= allow you to set and modify a variable.
C-style compound assignments are also provided.

The method names refer to the monoid of lists under concatenation,
but there are many other instances.

Some types can be viewed as a monoid in more than one way,
e.g. both addition and multiplication on numbers.
In such cases we often define newtypes and make those instances
of Monoid, e.g. Sum and Product.

Lift a semigroup into Maybe forming a Monoid according to
http://en.wikipedia.org/wiki/Monoid: "Any semigroup S may be
turned into a monoid simply by adjoining an element e not in S
and defining e*e = e and e*s = s = s*e for all s ∈ S." Since
there is no "Semigroup" typeclass providing just mappend, we
use Monoid instead.