I ran into a scenario where the use of MonadError would only be valid if catchError (pure a) h = pure a
One would expect to see
1. catchError (pure a) h = pure a
2. catchError (throwError e) h = h e
3. throwError e >>= f = throwError e
which would rule out silly instances like
instance MonadError () Maybe where
throwError () = Nothing
catchError _ f = f ()
I propose adding these 3 laws to MonadError haddocks.