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