我可以从Control.Proxy生成StateP MonadState的实例吗?

ajp*_*ajp 5 monads haskell haskell-pipes

我改变了一些代码,用来在内部运行的StateT单子到内运行StatePControl.Proxy.但是,我的一些代码(例如%=运算符来自Control.Lens)需要一个MonadState实例.我只是添加这样的实例是安全/正确的吗?这似乎是库最正确处理的东西(在本例中Control.Proxy).

Gab*_*lez 4

是的,这很安全。您想要的实例是:

instance (Monad m, Proxy p) => MonadState s (PS.StateP s p a' a b' b m) where
    get = PS.get
    put = PS.put
Run Code Online (Sandbox Code Playgroud)

我只是想简单地指出,在pipes-4.0.0(在 Github 上)不再需要代理变压器,并且相同的扩展被外包给基础 monad 中的 monad 变压器。这意味着而不是:

Consumer (StateP s p) a m r
Run Code Online (Sandbox Code Playgroud)

...你会使用:

Consumer a (StateT s m) r
Run Code Online (Sandbox Code Playgroud)

这意味着您可以编写:

lift $ myLens %= f
Run Code Online (Sandbox Code Playgroud)

然而,我仍然计划无论如何添加MonadState实例Proxy,尽管可能在一个单独的包中(我仍然没有决定是否将它们包含在主库中)。它们看起来像这样:

instance (MonadState s m) => MonadState s (Proxy a' a b' b m r) where
    put s = lift (put s)
    get   = lift get
Run Code Online (Sandbox Code Playgroud)