Haskell monad用于模拟

Ale*_*mov 3 haskell

表示通过输入更新状态的最佳方法是什么?

我模拟物理系统.它有状态(坐标,速度).状态由模拟更新,该模拟从中获取一些参数(力)stdin.结果stdout在每个模拟循环后进行.

程序应在N个循环后停止.

我已经完成了readIORef,writeIORef但这很难看.

lef*_*out 5

一种简单的方法是沿着懒惰(可能是无限的)列表而不是做任何显式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)