
On Fri, Jan 13, 2012 at 00:14, Johan Brinch
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" :-)
I now believe that the correct answer is simply "don't". For anyone who finds this thread later and wonder what happened: I refactored the code to never use IO inside of STM transactions. Instead, I'm now using the ErrorT IO STM to abort the transaction early with an IO action that needs to be run before a retry. Aborting with throwError doesn't rollback the transaction, which means one has to be extremely careful as to what state is manipulated before entering clean code (without any throwErrors). This seems a lot more safe than doing IO inside the STM transactions which has completely unpredictable (for me, at least) side effects. -- Johan Brinch