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