假设我有这样的事情:
data Environment = ...
data MyState = ...
data Report = ...
updateState :: Environment -> MyState -> MyState
updateState = ...
report :: MyState -> Report
report = ...
foo :: ReaderT Environment (State MyState) Report
foo = do env <- ask
state <- lift get
let newState = updateState env state
lift $ put newState
return $ report newState
我脑子里想的是一个时间过程的模拟,在这个过程中我有将存储的参数,Environment
动态状态将存储在MyState
,我希望在模拟的每个时间步收集的信息将存储在Report
。
现在,我不想运行此模拟的许多步骤并获取每个时间步骤的报告列表。
我通常在没有 a 的情况下执行此操作,ReaderT
并用于传递如下参数:
foo :: Enviroment -> State MyState Report
然后我会这样做:
manySteps :: Int -> Enviroment -> State MyState [Report]
manySteps n env = replicate n $ (foo env)
我对lift
and的类型感到困惑replicateM
。是否有一种组合可以复制State MyState
变压器内部的单子?
将来我会替换ReaderT Environment (State MyState) Report
forReaderT Environment (StateT MyState (Rand StdGen)) Report
所以最好在拥有这种怪物类型之前把事情做好:(。
编辑:作为一个附带问题 - 有没有比使用更好的策略ReaderT Environment (State MyState) Report
?