使用 STM 修改和打印状态



我可以使用STM初始化状态并将其打印出来:

module Main where
import Control.Concurrent.STM
data State = State {name :: String} deriving (Show)
type MyAppState = TVar [State]
initState :: STM MyAppState
initState = newTVar [State "hi"]
main :: IO ()
main =  
do 
state <- atomically initState
stateToPrint <- readTVarIO state
putStrLn (show stateToPrint)

我尝试创建函数来更新状态:

updateState :: String -> State -> State 
updateState newName s = State newName : s

但是我不确定如何在编译器不抛出错误的情况下将其放置在主"do"块中,因为它需要一种State但它被传递了MyAppState

您可以使用writeTVar :: TVar a -> a -> STM ()

main :: IO ()
main = do 
state <- atomically initState
stateToPrint <- readTVarIO state
putStrLn (show stateToPrint)
atomically (readTVar state >>=writeTVar state . fmap (updateState "foo"))

因此,我们在这里读取state的内容,然后我们通过fmap updateState传递它以更新列表中的元素,然后将其写入statevar。

话虽如此,寻找状态单体变压器可能很有用,就像transformers包的Control.Monad.Trans.State模块中一样。

请注意,您的updateState函数未正确定义,您可能希望像这样定义它:

updateState :: String -> State -> State 
updateState newName (States) = State (newName ++ s)

最新更新