[Haskell-cafe] IO trouble

Xiao-Yong Jin xj2106 at columbia.edu
Wed May 13 08:32:17 EDT 2009


Lauri Alanko <la at iki.fi> writes:

> 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'

So there is no way to do it without "monadize" g to g', is
it?  Big trouble, sigh.
-- 
    c/*    __o/*
    <\     * (__
    */\      <


More information about the Haskell-Cafe mailing list