ajp*_*ajp 5 monads haskell haskell-pipes
我改变了一些代码,用来在内部运行的StateT单子到内运行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
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)