import Control.Monad.Except (ExceptT(..), throwError) data Error = MyError | ThirdPartyError String -- some third-party function, that doesn't return our type doSomethingWithX :: Integer -> Either String () doSomethingWithX = undefined computeX :: (Monad m) => ExceptT Error m Integer computeX = undefined doStuff :: (Monad m) => ExceptT Error m () doStuff = do x <- computeX lift3rdParty $ doSomethingWithX x lift3rdParty :: (Monad m) => Either String t -> ExceptT Error m t lift3rdParty = either (throwError . ThirdPartyError) return