如何放大酸态?

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)

有任何想法吗?

J. *_*son 8

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)

  • 它值得吗?或者有没有办法提供`Zoomed`而不依赖于'镜头',因为它可以使用基本的`镜头`类型?(这个问题应该直接指向ekmett或酸态维护者.) (2认同)