у меня есть это
newtype State' s a = State' { runState' :: (s, Counts) -> (a, s, Counts) }
Теперь я хочу написать функцию
getCounts :: State' s a -> Counts
Есть ли способ добиться этого?
у меня есть это
newtype State' s a = State' { runState' :: (s, Counts) -> (a, s, Counts) }
Теперь я хочу написать функцию
getCounts :: State' s a -> Counts
Есть ли способ добиться этого?
возможно, это то, что вы ищете:
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
то вы можете добраться до графов так:
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
getCounts :: State' s Counts
? (до того, как вы запустите вычисление своего состояния, вы не можете знать счетчики, поэтому вместо этого вы можете запросить счетчик из состояния?) - person Random Dev   schedule 14.10.2014getCounts :: State' s Counts
, если быть точнее. - person bheklilr   schedule 14.10.2014getCounts = State' (\ (s,c) -> (c,s,c))
? - person Random Dev   schedule 14.10.2014State' s a ~ State (s, Counts) a
гдеState
отControl.Monad.State
? Я бы предложил посмотреть, какget
реализован для этой монады, чтобы получить некоторые идеи. - person bheklilr   schedule 14.10.2014Counts
, если вы просто хотите получить его от государства - на самом деле это всего лишь еще одинs
(я думаю, это то, что bheklilr тоже хотел сказать) - person Random Dev   schedule 14.10.2014evalState'
, я добавлю его к ответу - я думаю, это проще, чем делать это в режиме комментариев-чата - person Random Dev   schedule 14.10.2014