【问题标题】:How to zoom in acid-state?如何放大酸性状态?
【发布时间】:2013-12-20 00:16:49
【问题描述】:
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) ()))

有什么想法吗?

【问题讨论】:

    标签: haskell haskell-lens acid-state


    【解决方案1】:

    Control.Lens.Internal.Zoom.Zoomed 是一个类型族,它描述了在zoom 期间需要什么样的上下文。正如您在Control.Lens.Internal.Zoom module 中看到的那样,它执行了一些特殊的魔法。通常,zoom 的用户只要放大“典型”的 monad 转换器堆栈,就永远不需要看到这些东西。

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

    type instance Zoomed (Update x) = Focusing Identity
    

    【讨论】:

    • 所以可能没有办法将这个(和类似的实例)放入像lens-acidstate这样的包中?
    • 这需要一些更狡猾的模块杂耍——可能是acidstate-internalacidstatelens-acidstate 都依赖它。
    • 值得吗?或者有没有办法提供Zoomed 而不依赖lens,因为它可以使用基本的Lens 类型? (这个问题可能应该直接针对 ekmett 或酸态维护者。)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-27
    • 2012-10-08
    相关资源
    最近更新 更多