Any Monad which may report failure using extensible exceptions. This
most obviously applies to the Attempt data type, but you should just as well
use this for arbitrary Monads.
Usage should be straight forward: return successes and failure errors.
If you simply want to send a string error message, use failureString.
Although tempting to do so, fail is *not* used as a synonym for
failureString; fail should not be used at all.
Minimal complete definition: failure and wrapFailure.