gpt4 book ai didi

haskell - 如何以优雅的方式在大对象中设置 "change"单个值?

转载 作者:行者123 更新时间:2023-12-04 01:49:23 26 4
gpt4 key购买 nike

例如,我有

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 ...

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

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

最佳答案

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

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

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

关于haskell - 如何以优雅的方式在大对象中设置 "change"单个值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17518749/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com