[Haskell-cafe] STM: "nested atomically" error

Johan Brinch brinchj at gmail.com
Fri Jan 13 00:14:59 CET 2012

On Thu, Jan 12, 2012 at 22:56, Brandon Allbery <allbery.b at gmail.com> wrote:
> On Thu, Jan 12, 2012 at 16:50, Andrew Coppin <andrewcoppin at btinternet.com>
> wrote:
>> My guess is that your "debug printing" is causing something to be
>> evaluated when it otherwise wouldn't be, causing a transaction to begin
>> within a transaction.
> My guess is something is being lazily evaluated as usual, but if that is
> forced within a transaction, well, last I checked the GHC I/O system used
> STM internally so unsafePerformIO debug prints could well cause nested
> transactions.

This could be it. If I'm computing a value atomically and then using
this value in another transaction, I may nest transactions if the
value isn't forced?

x <- atomically $ foo
let x' = someOp x
atomically $ bar x'

Is it necessary to use seq here, or is it merely the debug printing
that's getting in the way?

Also, if the GHC IO system is using STM internally, what would be the
correct way to say write a file? (where the IO action can be retried
safely but have to run at least once, idempotent?). Please don't say
"don't" :-)

Johan Brinch

More information about the Haskell-Cafe mailing list