gpt4 book ai didi

haskell - 使用 STM 修改和打印状态

转载 作者:行者123 更新时间:2023-12-05 02:11:18 25 4
gpt4 key购买 nike

我能够使用 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” block 中,因为它需要一种类型 State 但传递给它的是 MyAppState.

最佳答案

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

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

我们在这里读取了 state 的内容,然后我们通过 fmap updateState 传递它来更新列表中的元素,然后我们将其写入状态 变量

也就是说,寻找状态 monad 转换器可能会有用,比如在 Control.Monad.Trans.State module 中的 transformers package .

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

updateState :: String -> State -> State 
updateState newName (State <b>s) = State (newName ++ s)</b>

关于haskell - 使用 STM 修改和打印状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57675081/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com