使用STM修改并打印状态

tim*_*lim 3 haskell 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)
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.

Wil*_*sem 5

您可以使用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

话虽这么说,寻找状态单子转换器可能很有用,就像在packageControl.Monad.Trans.State模块中一样。transformers

请注意,您的updateState函数未正确定义,您可能需要这样定义:

updateState :: String -> State -> State 
updateState newName (State s) = State (newName ++ s)
Run Code Online (Sandbox Code Playgroud)