使用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
的目的,这对我来说有点不方便。
这种情况是否有标准的解决方法?
答案 0 :(得分:1)
对我有用的解决方案是使用ALens
而不是Lens
,因为
当您需要将Lens存储在容器中时,也可以使用此类型,因为它是rank-1。
然后,我只是将Lens
运算符^.
和%~
替换为ALens
等效,^#
和#%~
。