Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell 如何定义可设置镜头_Haskell_Haskell Lens - Fatal编程技术网

Haskell 如何定义可设置镜头

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

我在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
但是,我也希望能够设置一个由颜色选择的玩家的属性。例如,在一个州内,单子持有一个
游戏
记录和一个
\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相信我,当我说我有时仍在与镜头库及其文档作斗争时。至少它有文档,但它肯定比其他库更难遵循类型。