2014-01-15 33 views
1

这里走出来的过期状态的使用状态单子的功能runGame使用状态单子

runGame = do 
    state <- get 
    addPoints 
    let newState = ...modify state in some way... 
    put newState 
  1. 我得到的状态
  2. 我修改
  3. 我把新的状态。

现在假设我修改状态addPoints太:

addPoints = do 
    modify (+1) 

的问题是,我在runGame状态是过时了。因此,当我修改该状态并将其恢复时,我已从addPoints中取消了更改。

解决这个问题的好方法是什么?我不想在每次函数调用“以防万一”后重新调用get状态,该函数修改了状态。我可以切换到始终使用modify而不是getput,但这使我的代码变得尴尬。

+3

为什么使用'modify'而不是'get' /'put'会让你的代码变得笨拙?这是在这里的正确解决方案 – bennofs

+0

当你执行'state < - get'时,你会得到执行过程中特定点的状态。然后执行'addPoints',它修改存储在monad中的状态(不是从第一行开始的'state')。图书馆的设计是以这种方式工作的,你必须在做任何事情之前获得当前的状态,否则你的状态会过时。 – bheklilr

回答

4

您正在寻找对状态进行原子/事务修改 - 这与modify提供的几乎完全相同。不可能在getputmodify之间“滑”一些状态修改操作。如果您不使用它,您必须管理确保在getput之间不发生任何事情的复杂性。