dave at zednenem.com
Mon Nov 3 22:08:25 EST 2008
On Mon, Nov 3, 2008 at 7:27 PM, shelarcy <shelarcy at gmail.com> wrote:
> On Tue, 04 Nov 2008 07:40:50 +0900, David Menendez <dave at zednenem.com> wrote:
>>> [ \(e :: ExitCode) -> ...
>>> , \(e :: PatternMatchFail) -> ...
>>> or just by using multiple catch clauses:
>>> `catch` (\(e :: ExitCode) -> ...)
>>> `catch` (\(e :: PatternMatchFail) -> ...)
>> I don't think those are equivalent. In the second case, the
>> PatternMatchFail handler scopes over the ExitCode handler.
> I think Duncan forgot to write parens. According to Ian's example,
> here is an equivalent code.
> `catch` (\(e :: ExitCode) -> ...))
> `catch` (\(e :: PatternMatchFail) -> ...)
That's equivalent to the code without the parentheses, but it isn't
equivalent to the code using "catches".
Assume we have exitCodeHandler :: ExitCode -> IO () and
pattternMatchHandler :: PatternMatchFail -> IO (),
1. action `catches` [ Handler exitCodeHandler, Handler patternMatchHandler ]
2. (action `catch` exitCodeHandler) `catch` patternMatchHandler
Let's further assume that "action" throws an ExitCode exception and
"exitCodeHandler" throws a PatternMatchFail exception. In example 1,
the PatternMatchFail exception thrown by "exitCodeHandler" is not
caught by "patternMatchHandler", but it in example 2 it is caught.
In other words, patternMatchHandler is active during the evaluation of
exitCodeHandler in example 2, but not in example 1.
Dave Menendez <dave at zednenem.com>
More information about the Glasgow-haskell-users