[Haskell-cafe] Stack overflow

Krzysztof Skrzętnicki gtener at gmail.com
Wed May 27 15:36:07 EDT 2009


2009/5/27 Bertram Felgenhauer <bertram.felgenhauer at googlemail.com>:
> I wrote:
>> Krzysztof Skrzętnicki wrote:
>>> The code for modifying the counter:
>>> (\ msg -> atomicModifyIORef ioref (\ cnt -> (cntMsg cnt msg,())))
>>
>> atomicModifyIORef does not force the new value of the IORef.
>> If the previous contents of the IORef is x, the new contents
>> will be a thunk,
>>
>>   (\ cnt -> (cntMsg cnt msg,())) x
>
> Sorry, it's slightly worse than that. The contents becomes
>
>    sel_0 (\ cnt -> (cntMsg cnt msg, ())) x
>
> where sel_0 is basically an RTS internal version of fst.
>
> Instead of reading the new value of the IORef, you could also force the
> old one:
>
>    atomicModifyIORef ioref (\ cnt -> (cntMsg cnt msg, msg)) >>= (return $!)
>

Thanks for the tip, although it seems tricky to get it right. I wonder
why there is no strict version of atomicModifyIORef?
Dually there might be a strict version of IORef datatype.

Best regards

Christopher Skrzętnicki


More information about the Haskell-Cafe mailing list