我可以使用 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)
Run Code Online (Sandbox Code Playgroud)
我尝试创建函数来更新状态:
updateState :: String -> State -> State
updateState newName s = State newName : s
Run Code Online (Sandbox Code Playgroud)
但我不确定如何将它放在主“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"))Run Code Online (Sandbox Code Playgroud)
因此,我们在这里读取 的内容state,然后将其传递给 anfmap updateState来更新列表中的元素,然后将其写入 var state。
话虽这么说,寻找状态单子转换器可能很有用,就像在package的Control.Monad.Trans.State模块中一样。transformers
请注意,您的updateState函数未正确定义,您可能需要这样定义:
updateState :: String -> State -> State
updateState newName (State s) = State (newName ++ s)Run Code Online (Sandbox Code Playgroud)