A groupoid is structure consisting of a set of elements (here
a Haskell type) and a binary operator (in present case the
function `gappend`

).

It is comparable to the Monoid typeclass, but there is no
obligation that the set supports a neutral element (mempty in
Data.Monoid).

In geometry, bounding boxes (represented as two points -
bottom-left corner and top-right corner) give an example where
a groupoid may be more satisfying than a monoid. The union
operation on bounding boxes is essential to track the extent
of shapes after their superimposition. To fit bounding box
union into the Monoid typeclass one can do a clever trick
representing mempty with the bottom-left corner at positive
infinity and the top-right corner at negative infinity, the
standard implementation of union which uses min and max will
still proceed to identify the extreme corners correctly. This
is nice enough if the bounding box coordinates are represented
by Doubles, but a problem if they are Ints (say representing
grid coordinates) - one might decide it is better simply to
consider concrete bounding boxes and not their empty/infinite
cousins.