Haskell 如何定义可设置镜头
我在Haskell代码中有一个记录类型,我想定义一个镜头,它可以用作getter和setter。代码如下所示:Haskell 如何定义可设置镜头,haskell,haskell-lens,Haskell,Haskell Lens,我在Haskell代码中有一个记录类型,我想定义一个镜头,它可以用作getter和setter。代码如下所示: data Players = Players { _white :: Player , _black :: Player } deriving (Show, Eq) makeLenses ''Players _byColor :: Color -> Players -> Player
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
但是,我也希望能够设置一个由颜色选择的玩家的属性。例如,在一个州内,单子持有一个游戏
记录和一个\u玩家
字段
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组合器只会产生一个getter,你还没有定义一个完整的镜头。但是,定义完整镜头非常简单,您只需要根据传入的颜色返回正确的镜头:
byColor :: Color -> Lens' Players Player
byColor White = white
byColor Black = black
谢谢,这比我想象的容易多了。对不起,如果这是个愚蠢的问题。我不得不承认,我发现镜头的文档有点难以使用。@Lemming相信我,当我说我有时仍在与镜头库及其文档作斗争时。至少它有文档,但它肯定比其他库更难遵循类型。