On Mon, Nov 3, 2008 at 7:27 PM, shelarcy <shelarcy@gmail.com> wrote:
On Tue, 04 Nov 2008 07:40:50 +0900, David Menendez <dave@zednenem.com> wrote:
ie:
action `catches` [ \(e :: ExitCode) -> ... , \(e :: PatternMatchFail) -> ... ]
or just by using multiple catch clauses:
action `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.
(action `catch` (\(e :: ExitCode) -> ...)) `catch` (\(e :: PatternMatchFail) -> ...)
http://www.haskell.org/pipermail/libraries/2008-July/010095.html
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@zednenem.com> <http://www.eyrie.org/~zednenem/>