The strategy of combining computations that can throw exceptions by
bypassing bound functions from the point an exception is thrown to the
point that it is handled.
Is parameterized over the type of error information and the monad type
constructor. It is common to use
Either String as the
monad type constructor for an error monad in which error descriptions
take the form of strings. In that case and many other common cases the
resulting monad is already defined as an instance of the
MonadError class. You can also define your own error type
and/or use a monad type constructor other than
Either
String or
Either IOError. In
these cases you will have to explicitly define instances of the
MonadError class. (If you are using the deprecated
Control.Monad.Error or
Control.Monad.Trans.Error, you
may also have to define an
Error instance.)