Prelude.catch vs. Exception.catch

Ashley Yakeley ashley@semantic.org
Tue, 14 May 2002 04:10:16 -0700


At 2002-05-14 03:57, Simon Marlow wrote:

>It turns out that the compiler "bug" is really just the compiler being a
>bit loose with the IO monad - it freely translates the original
>definition of evaluate using 'seq' into the slightly less strict version
>by pushing the 'seq' through the state lambda of the IO monad (this only
>happens for the IO monad, and strictly speaking it's a deviation from
>the semantics but it has important performance benefits for IO code).

Under what circumstance would the compiler do this to my code? I really 
need to know about any deviation from the semantics.

>so your catch can be defined in terms of the current catch like so:
>
>	catch' a h = a `seq` (catch a h)

Oh yeah.

>what's the motivation for this change?

Well I think it's more intuitive. The documentation (sec. 5.12.3) says 
this:

     The simplest version is catch. It takes a single argument, runs 
     it, and if an exception is raised the "handler" is executed 
     passing the value of the exception. Otherwise, the result is 
     returned as normal.

...leading to the question, how do you 'run' bottom?

But since I can do what I want with your "catch'" function, it's not 
really that important.

-- 
Ashley Yakeley, Seattle WA