
Hi, I've got some functions in MonadError with different Error types. I would like to map errors of one Error type onto the other Error type. It seems that the only facility for doing this is mapErrorT, but that seems to force me to work in ErrorT rather than any old instance of MonadError. Am I barking up the wrong tree trying to keep the functions generalised over MonadError? Is there some other paradigm I should use for passing errors across system layers in haskell? I would like to do something like the following, but I don't know how to achieve the 'mapError errMap' part of g. instance Error Int where strMsg s = 0 f :: (MonadError Int m, MonadIO m) => Int -> m String f 0 = do liftIO $ putStrLn "The int is 0, that'll be an error." throwError (-27) f i = do liftIO $ putStrLn ("The int is " ++ show i ++ ", we'll do the division.") return $ show (100 `div` i) g :: (MonadError String m, MonadIO m) => Int -> m String g i = do liftIO $ putStrLn ("Will try to divide by " ++ show i) mapError errMap (f i) h :: (MonadIO m) => Int -> m String h i = (runErrorT (g i)) >>= either (\e -> return ("had an error: " ++ e)) return Thanks Daniel