On 14 January 2012 19:24, Rob Stewart <[email protected]> wrote: > On 14 January 2012 18:05, Steffen Schuldenzucker > <[email protected]> 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 _______________________________________________ Haskell-Cafe mailing list [email protected] http://www.haskell.org/mailman/listinfo/haskell-cafe
