我正在更改一些曾经在StateT
monad中运行的代码,以便从StateP
Control.Proxy
内部运行。但是,我的一些代码(例如%=
中的Control.Lens
运算符)需要MonadState
个实例。我只是添加这样的实例是安全/正确的吗?这似乎是库最正确处理的东西(在本例中为Control.Proxy
)。
答案 0 :(得分: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