Haskell 如何放大酸性状态?

Haskell 如何放大酸性状态?,haskell,haskell-lens,acid-state,Haskell,Haskell Lens,Acid State,鉴于上述代码,我的印象是应该可以做到这一点: data Foo = Foo { _bar :: Map String Integer } deriving (Eq, Ord, Read, Show, Data, Typeable) $(deriveSafeCopy 0 'base 'Foo) $(makeLenses ''Foo) 但GHC将抱怨如下: addEntry :: String -> Update Foo () addEntry s = zoom bar $ modi

鉴于上述代码,我的印象是应该可以做到这一点:

data Foo = Foo {
  _bar :: Map String Integer
} deriving (Eq, Ord, Read, Show, Data, Typeable)

$(deriveSafeCopy 0 'base 'Foo)

$(makeLenses ''Foo)
但GHC将抱怨如下:

addEntry :: String -> Update Foo ()
addEntry s = zoom bar $ modify $ insert s 0

有什么想法吗?

Control.Lens.Internal.Zoom.Zoomed
是一个类型族,它描述了在
缩放过程中需要什么样的上下文。它执行一些特殊的魔术,你可以看到在。通常,
zoom
的用户只要放大“典型的”monad transformer堆栈,就永远不需要看到这些东西

Update
,虽然只是在封面下实现为
State
,但没有缩放实例。它的实现也没有被导出,因此您无法编写自己的实现,尽管这非常简单,因为
Update
不使用monad转换器

src/Backend.hs:39:20:
    No instance for (Functor
                       (Control.Lens.Internal.Zoom.Zoomed (Update Foo) ()))

因此,可能没有办法将此(以及类似的实例)放入像
lens acidstate
这样的包中。它需要一些更狡猾的模块来处理
acidstate内部的
,而
acidstate
lens acidstate
都依赖于此。值得吗?或者有没有一种方法可以提供
缩放
,而不依赖
镜头
,就像基本
镜头
类型一样?(这个问题可能应该直接问ekmett或酸性状态维护者。)
type instance Zoomed (Update x) = Focusing Identity