Haskell 从一元动作返回镜头的变通方法

Haskell 从一元动作返回镜头的变通方法,haskell,haskell-lens,Haskell,Haskell Lens,玩游戏时遇到了这个问题 假设我有: data Cache = Cache { _a :: Int, _b :: Int } makeLenses ''Cache type Register = Lens' Cache Int 使用Parsec,我可以将字符“a”解析为a::Register,将字符“b”解析为b::Register register = a <$ char 'a' <|> b <$ char 'b' register=a解析u m((Int->f I

玩游戏时遇到了这个问题

假设我有:

data Cache = Cache { _a :: Int, _b :: Int }
makeLenses ''Cache

type Register = Lens' Cache Int
使用Parsec,我可以将字符“a”解析为
a::Register
,将字符“b”解析为
b::Register

register = a <$ char 'a' <|> b <$ char 'b'
register=a解析u m((Int->f Int)->Cache->f Cache)

我想我理解它的推理——它希望尽可能地浮动类型类约束;为了记录
注册表
,这对我来说有点不方便

register = a <$ char 'a' <|> b <$ char 'b'

像这样的情况有没有标准的解决办法?

对我有效的解决方案是使用而不是
镜头,如图所示

当您需要将镜头存储在容器中时,也可以使用此类型,因为它是秩-1


然后,我将我的
Lens
操作符
^.
%~
替换为它们的
alen
等价物,
^
%~
,另一种选择是使用
WrappedLens
,这将保持多态性,并避免任何可能需要将
alen
转换为
Lens
,这会花你一点钱。或者手工制作
寄存器
一个秩2的新类型。