[Haskell-cafe] STM atomic blocks in IO functions

Rob Stewart robstewart57 at googlemail.com
Sat Jan 14 20:24:36 CET 2012

On 14 January 2012 18:05, Steffen Schuldenzucker
<sschuldenzucker at uni-bonn.de> wrote:

> I think "consistent state" here means that you can be sure no other thread
> has modified a, say, TVar, within the current 'atomically' block.

OK, well take a modified example, where I am wanting to call an IO
function within an atomically block:
import Control.Concurrent.STM
import Control.Monad.IO.Class (liftIO)

addThree :: TVar Int -> Int -> STM ()
addThree t = do
  i <- liftIO three -- Problem line
  ls <- readTVar t
  writeTVar t (ls + i)

three :: IO Int
three = return 3

main :: IO ()
main = do
  val <- atomically $ do
   tvar <- newTVar 0
   addThree tvar
   readTVar tvar
  putStrLn $ "Value: " ++ show val

Are IO functions permissible in STM atomically blocks? If so how? If
not, how would one get around a problem of having to use an IO
function to retrieve a value that is to be written to a TVar ?


More information about the Haskell-Cafe mailing list