从monadic动作返回镜头的解决方法

时间:2015-12-23 15:08:31

标签: haskell lens

使用today's advent of code problem时遇到此问题。

说我有:

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提供显式类型Stream s m Char => ParsecT s u m Register时,ghc会抱怨它要为其指定类型(Functor f, Stream s m Char) => ParsecT s u m ((Int -> f Int) -> Cache -> f Cache)

我认为我理解它的推理 - 它希望尽可能地放弃类型类约束;对于记录register的目的,这对我来说有点不方便。

这种情况是否有标准的解决方法?

1 个答案:

答案 0 :(得分:1)

对我有用的解决方案是使用ALens而不是Lens,因为

  

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

然后,我只是将Lens运算符^.%~替换为ALens等效,^##%~