
On Monday 16 May 2011 23:05:22, Yves Parès wrote:
Probably because in the instance of Monad Either, fail has not been overloaded, and still has its default implementation: fail = error
Right. It used to be different in mtl-1.*, when there was an instance Error e => Monad (Either e) where return = Right Left err >>= _ = Left err Right x >>= k = k x fail msg = strMsg msg defined in Control.Monad.Error. Now we have instance Monad (Either e) where ... defined in Control.Monad.Instances, and there's no method to get an arbitrary e from a String (except error).
Whereas runErrorT explicitely catches the exception.
`catches' is the wrong word, the Monad instance of ErrorT, instance (Monad m, Error e) => Monad (ErrorT e m) where ... has fail msg = ErrorT $ return (Left (strMsg msg)) That's probably what you meant, though.