data Foo = Foo {
_bar :: Map String Integer
} deriving (Eq, Ord, Read, Show, Data, Typeable)
$(deriveSafeCopy 0 'base 'Foo)
$(makeLenses ''Foo)
鉴于上述代码,我认为应该可以这样做:
addEntry :: String -> Update Foo ()
addEntry s = zoom bar $ modify $ insert s 0
但GHC会抱怨:
src/Backend.hs:39:20:
No instance for (Functor
(Control.Lens.Internal.Zoom.Zoomed (Update Foo) ()))
有什么想法吗?
答案 0 :(得分:8)
Control.Lens.Internal.Zoom.Zoomed
是一个类型系列,用于描述zoom
期间所需的上下文类型。它可以执行一些特殊的魔法,你可以在Control.Lens.Internal.Zoom
module中看到。通常,zoom
的用户只要放大“典型”monad变换器堆栈就永远不需要看到那些东西。
Update
虽然仅在封面下方State
实施,但没有缩放实例。它的实现也没有导出,所以你不能自己写,虽然它是非常简单的,因为Update
不使用monad变换器。
type instance Zoomed (Update x) = Focusing Identity