我有这个
newtype State' s a = State' { runState' :: (s, Counts) -> (a, s, Counts) }
现在我想写一个函数
getCounts :: State' s a -> Counts
有什么方法可以实现这个目标吗?
答案 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