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

有任何想法吗?

4

1 回答 1

8

Control.Lens.Internal.Zoom.Zoomed是一个类型族,它描述了在zoom. 正如您在Control.Lens.Internal.Zoom模块中看到的那样,它执行了一些特殊的魔法。zoom通常,只要他们放大“典型”的单子变压器堆栈,用户就永远不需要看到这些东西。

Update,虽然只是State在幕后实现,但没有缩放实例。它的实现也没有导出,因此您无法编写自己的实现,尽管由于Update不使用 monad 转换器,所以它非常简单。

type instance Zoomed (Update x) = Focusing Identity
于 2013-12-19T16:16:49.767 回答