如何在State Monad中定义初始状态?

时间:2012-02-29 22:39:25

标签: haskell

我在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)

1 个答案:

答案 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)