如何放大酸态?

时间:2013-12-19 16:01:40

标签: haskell lens acid-state

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) ()))

有什么想法吗?

1 个答案:

答案 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