runThrow (throwError e >>= k) = runThrow (throwError e)
>>> import Control.Monad.Except (runExcept) >>> throwEnvelopeErr "BAD_ERROR" "a very bad error occurred!" :: Either (Err String) Int Left (Err {errErr = "BAD_ERROR", errExtra = Just "a very bad error occurred!"})
foo :: IO (String, String, String) foo = replicateT getLine
> foo Hello world ! ("Hello","world","!")