我正在将一些曾经在StateT
monad 中运行的代码更改为在StateP
from中运行Control.Proxy
。但是,我的一些代码(例如%=
from 的运算符Control.Lens
)需要一个MonadState
实例。只添加这样一个实例对我来说是否安全/正确?这似乎是由库最正确处理的东西(在这种情况下,Control.Proxy
)。
问问题
167 次
1 回答
4
是的,这是安全的。您想要的实例是:
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
于 2013-06-23T15:01:50.087 回答