我可以使用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
传递它以更新列表中的元素,然后将其写入state
var。
话虽如此,寻找状态单体变压器可能很有用,就像在transformers
包的Control.Monad.Trans.State
模块中一样。
请注意,您的updateState
函数未正确定义,您可能希望像这样定义它:
updateState :: String -> State -> State
updateState newName (States) = State (newName ++ s)