Haskell 如何放大酸性状态?
鉴于上述代码,我的印象是应该可以做到这一点:Haskell 如何放大酸性状态?,haskell,haskell-lens,acid-state,Haskell,Haskell Lens,Acid State,鉴于上述代码,我的印象是应该可以做到这一点: data Foo = Foo { _bar :: Map String Integer } deriving (Eq, Ord, Read, Show, Data, Typeable) $(deriveSafeCopy 0 'base 'Foo) $(makeLenses ''Foo) 但GHC将抱怨如下: addEntry :: String -> Update Foo () addEntry s = zoom bar $ modi
data Foo = Foo {
_bar :: Map String Integer
} deriving (Eq, Ord, Read, Show, Data, Typeable)
$(deriveSafeCopy 0 'base 'Foo)
$(makeLenses ''Foo)
但GHC将抱怨如下:
addEntry :: String -> Update Foo ()
addEntry s = zoom bar $ modify $ insert s 0
有什么想法吗?
Control.Lens.Internal.Zoom.Zoomed
是一个类型族,它描述了在缩放过程中需要什么样的上下文。它执行一些特殊的魔术,你可以看到在。通常,zoom
的用户只要放大“典型的”monad transformer堆栈,就永远不需要看到这些东西
Update
,虽然只是在封面下实现为State
,但没有缩放实例。它的实现也没有被导出,因此您无法编写自己的实现,尽管这非常简单,因为Update
不使用monad转换器
src/Backend.hs:39:20:
No instance for (Functor
(Control.Lens.Internal.Zoom.Zoomed (Update Foo) ()))
因此,可能没有办法将此(以及类似的实例)放入像lens acidstate
这样的包中。它需要一些更狡猾的模块来处理acidstate内部的,而acidstate
和lens acidstate
都依赖于此。值得吗?或者有没有一种方法可以提供缩放
,而不依赖镜头
,就像基本镜头
类型一样?(这个问题可能应该直接问ekmett或酸性状态维护者。)
type instance Zoomed (Update x) = Focusing Identity