[Haskell-cafe] IO trouble

Lauri Alanko la at iki.fi
Tue May 12 20:45:24 EDT 2009


On Tue, May 12, 2009 at 04:59:36PM -0400, Xiao-Yong Jin wrote:
> > f :: a -> b
> > g :: (a -> b) -> c -> d

> > gf :: c -> d
> > gf = g f
> 
> Now I want to handle exceptions in f and redefine f as in f'
> 
> > f' :: a -> IO (Either e b)
> 
> So my question is how to define gf' now to use f' instead of
> f?
> 
> > gf' :: c -> IO (Either e d)

Use Control.Monad.Error.ErrorT, it's exactly for this. You have to
"monadize" g to be able to pass f' as an argument to it.

f' :: a -> ErrorT e IO b
g' :: Monad m => (a -> m b) -> c -> m d
gf' :: c -> ErrorT e IO d
gf' = g' f'

Here "e" should be some fixed instance of Error.

HTH.


Lauri


More information about the Haskell-Cafe mailing list