我正在更改一些曾经在 StateT
中运行的代码monad 在 StateP
内运行来自 Control.Proxy
.但是,我的一些代码(例如 %=
中的 Control.Lens
运算符)需要一个 MonadState
实例。添加这样的实例对我来说是否安全/正确?这似乎是图书馆最正确处理的事情(在这种情况下, Control.Proxy
)。
最佳答案
是的,这是安全的。你想要的实例是:
instance (Monad m, Proxy p) => MonadState s (PS.StateP s p a' a b' b m) where
get = PS.get
put = PS.put
我只想简要说明在
pipes-4.0.0
中(在 Github 上)不再需要代理转换器,并且相同的扩展被外包给基础 monad 中的 monad 转换器。这意味着,而不是:Consumer (StateP s p) a m r
...你会使用:
Consumer a (StateT s m) r
这意味着您将只能编写:
lift $ myLens %= f
但是,我仍然打算添加
MonadState
Proxy
的实例无论如何,虽然可能在一个单独的包中(我还没有决定是否将它们包含在主库中)。它们看起来像这样:instance (MonadState s m) => MonadState s (Proxy a' a b' b m r) where
put s = lift (put s)
get = lift get
关于haskell - 我可以让 Control.Proxy 中的 StateP 成为 MonadState 的实例吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17258711/