[Haskell-cafe] TVars & throw

Chris Kuklewicz haskell at list.mightyreason.com
Thu Mar 8 04:35:25 EST 2007


Stefan O'Rear wrote:
> On Thu, Mar 08, 2007 at 12:25:15PM +1100, Thomas Conway wrote:
>> Hi All,
>>
>> Consider the following:
>>
>> foo = do
>>    v <- newTVar "hi there!"
>>    throwDyn v
>>
>> main = do
>>    catchDyn (atomically foo) \v -> do
>>        x <- atomically (readTVar v)
>>        putStr x
>>
>>
>> I.e. throw information that gets rolled back from inside a
>> transaction, catch it and use it.
>>
>> This looks like bad. I assume it actually works, but should it?
> 
> Read the paper!
> 
> it is quite explicitly documented that exceptions can take data out of
> a failing transaction, spj thought it preferable to simply erasing all
> error data. 
> 
> Stefan

And one can always use unsafeIOToSTM to exchange data as well, which is what I
used to implement MonadAdvSTM.  This lets you queue IO actions to perform if
there is a retry and queue IO actions to perform if there is a commit.

http://haskell.org/haskellwiki/New_monads/MonadAdvSTM



More information about the Haskell-Cafe mailing list