
On 14 January 2012 19:24, Rob Stewart
On 14 January 2012 18:05, Steffen Schuldenzucker
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 ?
-- Rob
No that's not possible. An STM transaction may be tried several times so allowing IO doesn't make sense. Instead you pass any values that you need into the transaction. e.g. line <- getLine atomically $ do writeTVar v line ... Daniel