假設我有這樣的事情:monad變壓器中的內部monad是否有`replicateM`函數?
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
更好的策略?
使用ReaderT和StateT看起來合理的策略。爲了實際使用,我建議不要直接使用「請求,獲取,放置」,使用描述性名稱定義一個簡短的別名或助手,然後使用它。這允許您編輯Monad堆棧的實現,並且只需要更新幫助器。 – 2011-03-16 16:00:45