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
_______________________________________________
Haskell-Cafe mailing list
[email protected]
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to