
On Sun, Sep 26, 2010 at 3:09 PM, Maciej Piechotka
On Sun, 2010-09-26 at 15:46 -0400, Simon Marlow wrote:
On 26/09/10 13:55, Bas van Dijk wrote:
On Sun, Sep 26, 2010 at 6:13 PM, Antoine Latter
wrote: Your new catchSTM can be written from the old one:
newCatchSTM stm h = catchSTM stm (h . fromJust . fromException . toException)
Agree in principle, but I don't think that implementation works, does it? If the exception is the wrong type, fromJust will throw an error, whereas you want to just re-throw the original exception.
I will make a patch out of this and attach it to the ticket. We'll see what the GHC devs think of it.
Fine by me.
Cheers, Simon
newCatchSTM stm h = catchSTM stm (\e -> maybe (throwSTM e) f $ fromException e)
It also would work to copy the GHC.IO version:
unSTM (STM stm) = stm
catchSTM :: Exception e => STM a -> (e -> STM a) -> STM a catchSTM (STM stm) handler = STM $ catchSTM# stm handler' where handler' e = case fromException e of Just e' -> unSTM (handler e') Nothing -> raiseIO# e
Although the catchException in GHC.IO uses raise# instead of raiseIO# - that may be for a reason. I had thought they were really similar underneath the hood, though. Antoine