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","!")
>>> pure 1 :: Maybe Int Just 1
>>> pure 'z' :: [Char] "z"
>>> pure (pure ":D") :: Maybe [String] Just [":D"]