这是使用状态monad的函数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
,但这会让我的代码变得尴尬。
答案 0 :(得分:4)
您正在寻找对状态的原子/事务修改 - 这几乎与modify
提供的完全相同。使用get
在put
和modify
之间“滑动”某些状态修改操作是不可能的。如果您不使用它,则必须管理确保get
和put
之间不会发生任何事情的复杂性。