1
这里走出来的过期状态的使用状态单子的功能runGame
:使用状态单子
runGame = do
state <- get
addPoints
let newState = ...modify state in some way...
put newState
- 我得到的状态
- 我修改
- 我把新的状态。
现在假设我修改状态addPoints
太:
addPoints = do
modify (+1)
的问题是,我在runGame
状态是过时了。因此,当我修改该状态并将其恢复时,我已从addPoints
中取消了更改。
解决这个问题的好方法是什么?我不想在每次函数调用“以防万一”后重新调用get
状态,该函数修改了状态。我可以切换到始终使用modify
而不是get
和put
,但这使我的代码变得尴尬。
为什么使用'modify'而不是'get' /'put'会让你的代码变得笨拙?这是在这里的正确解决方案 – bennofs
当你执行'state < - get'时,你会得到执行过程中特定点的状态。然后执行'addPoints',它修改存储在monad中的状态(不是从第一行开始的'state')。图书馆的设计是以这种方式工作的,你必须在做任何事情之前获得当前的状态,否则你的状态会过时。 – bheklilr