我在http://www.haskell.org/haskellwiki/State_Monad部分找到了这个 但我不清楚如何定义c和f的初始状态。
虽然它适用于IORefs,但我不需要全局可变数据。
increment :: StateT Integer IO Integer
increment = do
n <- get
put (n+1)
return n
plusOne :: Integer -> IO Integer
plusOne n = execStateT increment n
printTChan mtch = do
forever $ do
m <- atomically $ readTChan mtch
case m of
"ping" -> plusOne c
_ -> plusOne f
print (c)
答案 0 :(得分:7)
使用StateT
时,您可以将run/eval/execStateT
视为标记州的范围,因此您所拥有的只是一种奇特的写作方式:
plusOne n = return (n+1)
由于您忽略了这些操作的结果,因此无效。
如果你想在整个计算中携带状态,你需要构建你的代码,以便整个事情在StateT
中运行:
printTChan mtch = flip evalStateT (c0, f0) $ do
forever $ do
m <- liftIO . atomically $ readTChan mtch
case m of
"ping" -> modify incrementC
_ -> modify incrementF
(c, f) <- get
liftIO $ print c
incrementC (c, f) = (c+1, f)
incrementF (c, f) = (f, c+1)
现在,您可以填写初始状态值来代替(c0, f0)
。