次のようなものがあるとします。
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
ます。
ここで、このシミュレーションの多くのステップを実行して、各時間ステップのレポートを含むリストを取得したくありません。
私は通常、 なしでこれをReaderT
行い、次のようにパラメーターを渡していました。
foo :: Enviroment -> State MyState Report
それから私はただやります:
manySteps :: Int -> Enviroment -> State MyState [Report]
manySteps n env = replicate n $ (foo env)
lift
との型で混乱していますreplicateM
。State MyState
トランスフォーマー内でモナドを複製する組み合わせはありますか?
将来的には交換ReaderT Environment (State MyState) Report
するReaderT Environment (StateT MyState (Rand StdGen)) Report
ので、このモンスタータイプになる前に物事を正しく取得することをお勧めします:(.
編集:副次的な質問として-使用するよりも良い戦略はありReaderT Environment (State MyState) Report
ますか?