Proposal: Add throwSTM and generalize catchSTM

Antoine Latter aslatter at gmail.com
Sun Sep 26 17:21:42 EDT 2010


On Sun, Sep 26, 2010 at 3:09 PM, Maciej Piechotka <uzytkownik2 at gmail.com> wrote:
> 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<aslatter at gmail.com>  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


More information about the Libraries mailing list