catchE
    :: (Monad m, Suitable m (Either e' a))
    => ExceptT e m a
    -> (e -> ExceptT e' m a)
    -> ExceptT e' m a
catchE m h =
    ExceptT $
    do a <- runExceptT m
       case a of
           Left l -> runExceptT (h l)
           Right r -> return (Right r)

catchE
    :: (Monad m, Suitable m (Either e' a))
    => ExceptT e m a
    -> (e -> ExceptT e' m a)
    -> ExceptT e' m a
catchE m h =
    ExceptT $
    do a <- runExceptT m
       case a of
           Left l -> runExceptT (h l)
           Right r -> return (Right r)

catchE m h =
    ExceptT $
    do a <- runExceptT m
       case a of
           Left l -> runExceptT (h l)
           Right r -> return (Right r)
