> >The idea is
> >that if you want to use Exceptions in their full glory, you:
> ...
> >     import qualified Exception
> 
> I've noticed something a bit unusual about Exception.catch. 
> It seems it 
> can't catch "return undefined" by itself. Consider these 
> values of type 
> "IO String":
> 
>      iouPure :: IO String;
>      iouPure = undefined;
> 
>      iouError :: IO String;
>      iouError = error "error";
> 
> These aren't even an IO actions, they're simply bottom. 
> Straightforward 
> enough. But they _will_ be caught by Exception.catch.
> 
>      iouFail :: IO String;
>      iouFail = fail "failure";
> 
>      iouEvaluate :: IOString;
>      iouEvaluate = Exception.evaluate undefined;
> 
> These two are IO actions that "fail" when executed. They will also be 
> caught by Exception.catch.
> 
>      iouReturn :: IO String;
>      iouReturn = return undefined;
> 
> This one is an IO action that "succeeds" when executing. It 
> _won't_ be 
> caught by Exception.catch, which will instead simply return 
> the undefined 
> value.
> 
> I'm not sure what to make of this...

This is just an artifact of the laziness of 'return'.  One of the monad
laws is

        return a >>= k  =  k a

so therefore

        return undefined >>= (\_ -> m)   =  m

so return can't be strict.  Since return isn't strict,

        return undefined `seq` a  =  a

So that's really why we have Exception.evaluate: it's a strict version
of return.

Cheers,
        Simon
_______________________________________________
Glasgow-haskell-users mailing list
[EMAIL PROTECTED]
http://www.haskell.org/mailman/listinfo/glasgow-haskell-users

Reply via email to