The bounds of a bounded type:
minBound :: Bounded a => a
maxBound :: Bounded a => a
Converting an integer to an enumerated type: toEnum :: Enum a => Int -> a
Casting between numeric types: fromIntegral :: (Integral a, Num b) -> a -> b
Parsing a string into a value: read :: Read a => String -> a
An empty instance of a container that can be concatenated: mempty :: Monoid m => m
An effectful action that simply returns a constant value: return :: Monad m => a -> m a
It leads to clearer code because you don’t need to specify so many types—either it’s clear (and inferable) from context, or you want to write generic code. For example, with Monoid (mempty & mappend) I can implement a function called mconcat, which concatenates a list of stuff: mconcat :: Monoid m => [m] -> m
mconcat = foldr mappend mempty
Now I can join a list of strings, concatenate a list of lists, union a list of sets, or even the optional versions of any of those: mconcat [Just "foo", Nothing, Nothing, Just "bar"]
=
Just "foobar"