The documentation for Control.Monad.Fail notes
> If your Monad is also MonadPlus, a popular definition is
>> fail _ = mzero
This could be made a default definition for MonadPlus or Alternative
> class Monad m => MonadFail m where
> fail :: String -> m a
> fail = const empty
> default fail :: Alternative m => String -> m a
This simplifies instances like [] and Maybe
> instance MonadFail []
> instance MonadFail Maybe