5

我正在将一些曾经在StateTmonad 中运行的代码更改为在StatePfrom中运行Control.Proxy。但是,我的一些代码(例如%=from 的运算符Control.Lens)需要一个MonadState实例。只添加这样一个实例对我来说是否安全/正确?这似乎是由库最正确处理的东西(在这种情况下,Control.Proxy)。

4

1 回答 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 回答