[Haskell-cafe] Re: Control.Exceptions and MonadIO

Brian Hulley brianh at metamilk.com
Sun Apr 23 21:02:43 EDT 2006

I've started work on a module to replace Control.Exception by wrapping all 
the original Control.Exception functions in more general monadic functions 
and using two type classes as follows:

class MonadIO m => MonadException m where
     catch :: m a -> (Exception -> m a) -> m a
     catchDyn :: Typeable exception => m a -> (exception -> m a) -> m a
     catchJust :: (Exception -> Maybe b) -> m a -> (b -> m a) -> m a
     try :: m a -> m (Either Exception a)
     tryJust :: (Exception -> Maybe b) -> m a -> m (Either b a)


class MonadIO m => MonadIOU m where
    getUnliftIO :: m (m a -> IO a)

All the other functions can be implemented just using MonadIO or MonadIOU or 
MonadException in place of IO (depending on the function eg bracket needs 
MonadIOU) - just in case anyone is interested.

As far as I can tell this seems to be the one and only way to do it with the 
minimal sized classes but I'd be interested if anyone has found a better 

Regards, Brian.

More information about the Haskell-Cafe mailing list