访问State Monad haskell中的计数

时间:2014-10-14 13:13:27

标签: haskell state monads

我有这个

newtype State' s a = State' { runState' :: (s, Counts) -> (a, s, Counts) }

现在我想写一个函数

getCounts :: State' s a -> Counts

有什么方法可以实现这个目标吗?

1 个答案:

答案 0 :(得分:3)

也许这就是你要找的东西:

getCounts :: State' s Counts
getCounts = State' (\ (s,c) -> (c,s,c))

然后你可以在计算中使用它:

myStateComp = do
  -- whaever
  counts <- getCounts
  -- ...

是的,你也可以eval

假设您的evalState'是这样的:

evalState' :: State' s a -> s -> Counts -> a
evalState' st initState initCounts = 
    let (a,_,_) = runState st (initState,initCounts)
    in a

那么你可以像这样进入Counts:

evalState' getCounts initState initCount

当然这只会让你回到initCount - 但是如果没有更多的计算,我就看不出还能回答什么。

一个真实的例子可能是这样的:

myComp = do
  -- ... do comp
  getCounts

然后

evalState' myComp initState initCount

将在里面运行任何计算,然后返回最后一次计数

替代

替代@bheklilr暗示正在使用

import Control.Monad.State

type State' s a = State (s, Counts) a

myStateComp = do
  -- whaever
  (state,counts) <- get
  -- ...

所以这里的getCounts只是fmap snd get