gpt4 book ai didi

haskell - 如何定义可设置镜头

转载 作者:行者123 更新时间:2023-12-02 18:25:13 25 4
gpt4 key购买 nike

我的 Haskell 代码中有一个记录类型,我想为其定义一个可用作 getter 和 setter 的镜头。代码如下所示:

data Players = Players { _white :: Player
, _black :: Player
} deriving (Show, Eq)
makeLenses ''Players
_byColor :: Color -> Players -> Player
_byColor White = _white
_byColor Black = _black
byColor col = to (_byColor col)

Players 是保存白人和黑人玩家的记录。我希望能够通过镜头时尚的颜色来获得一名球员。例如

players ^. byColor White . hp  -- Access health-points of player

但是,我还希望能够设置按颜色选择的玩家的属性。例如。在保存带有 _players 字段的 Game 记录的状态单子(monad)内。

let current = White
players . byColor current . hp %= (-1)

使用我当前的 byColor 定义,代码无法编译并显示以下错误消息:

No instance for (Contravariant Identity)
arising from a use of `byColor'
Possible fix:
add an instance declaration for (Contravariant Identity)

我做错了什么?

最佳答案

to 组合器仅生成 setter/getter ,您尚未定义完整的透镜。然而,定义完整的镜头非常简单,您只需根据传入的颜色返回正确的镜头即可:

byColor :: Color -> Lens' Players Player
byColor White = white
byColor Black = black

关于haskell - 如何定义可设置镜头,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27623260/

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