使用状态monad的过期状态

时间:2014-01-15 19:26:25

标签: haskell

这是使用状态monad的函数runGame

runGame = do
    state <- get
    addPoints
    let newState = ...modify state in some way...
    put newState
  1. 我得到了州
  2. 我修改它
  3. 我把新状态。
  4. 现在假设我也修改了addPoints中的状态:

    addPoints = do
      modify (+1)
    

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

    中的更改无效

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

1 个答案:

答案 0 :(得分:4)

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