<div dir="ltr">In the stm package, the docs for atomically read:<br><br><div>> You cannot use 'atomically' inside an 'unsafePerformIO' or 'unsafeInterleaveIO'. Any attempt to do so will result in a runtime error.  (Reason: allowing this would effectively allow a transaction inside a transaction, depending on exactly when the thunk is evaluated.)</div><div><br></div><div>This doesn't seem to be true. The following program runs fine:</div><div><br></div><div><div>    import Control.Monad.STM</div><div>    import Control.Concurrent.STM.TVar</div><div>    import System.IO.Unsafe</div><div>    </div><div>    main :: IO ()</div><div>    main = do</div><div>      v <- atomically $ newTVar (7 :: Int)</div><div>      print $ unsafePerformIO $ atomically $ do</div><div>        readTVar v</div><div><br></div><div>I suspect that the runtime only gives you an error if you actually create a nested transaction. Is my understanding correct?</div><div><br><div class="gmail_signature">-Andrew Thaddeus Martin</div>
</div></div></div>