11

例如,我有

data ShipDesign = ShipDesign {
      offense :: Offense
    , defense :: Defense
    , maxHealth :: Integer
    , repairRate :: Integer
    , stealth :: Integer
    , radar :: Integer
    , speed :: Integer
    , shipType :: String
    ...
    }

现在我想改变防守。已知的方法是:

changeDefense :: (Defense -> Defense) -> ShipDesign -> ShipDesign
changeDefense fDef sd@(ShipDesign o d m rr s r sp st ...) = ShipDesign o (fDef d) m rr s r sp st ...

这不优雅。尤其是在游戏中,每一步只改变几个值是很常见的。

我的问题是:是否有库、设计模式或其他方式以更优雅的方式更改单个值?

4

2 回答 2

15

是的,您可以使用记录更新表示法:

 changeDefense :: (Defense -> Defense) -> ShipDesign -> ShipDesign
 changeDefense fDef sd = sd { defense = fDef (defense sd) }

但是,当您使用它时,记录更新表示法的局限性就会显现出来,您会想要更强大的东西。那时,您应该开始了解镜头

于 2013-07-08T03:37:23.960 回答
3

我想知道为什么没有人提出镜头?

我推荐 Gabriel Gonzalez 的简短介绍: http ://www.haskellforall.com/2013/05/program-imperatively-using-haskell.html?m=1

编辑:哦……我读完了最后一句话。但这个建议仍然有效。

于 2013-07-18T16:40:11.467 回答