表示通过输入更新状态的最佳方法是什么?
我模拟物理系统.它有状态(坐标,速度).状态由模拟更新,该模拟从中获取一些参数(力)stdin.结果stdout在每个模拟循环后进行.
程序应在N个循环后停止.
我已经完成了readIORef,writeIORef但这很难看.
一种简单的方法是沿着懒惰(可能是无限的)列表而不是做任何显式IO.
import Control.Monad.State
-- Prerequisites:
data SimState -- coordinates & velocities.
data SimTVParams -- what's read from input. `instance Read`.
initialState :: SimState
simStep :: SimTVParams -> SimState -> SimState
simStateInfo :: SimState -> String
-- How to do the simulation:
main :: IO ()
main = interact $
unlines . map simStateInfo
. simulate initialState
. map read . lines
simulate :: SimState -> [SimTVParams] -> [SimState]
simulate iState = (`evalState` iState) . mapM (state . step)
where step params oldState = (newState, newState)
where newState = simStep params oldState
Run Code Online (Sandbox Code Playgroud)