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

时间:2013-06-23 07:52:45

标签: haskell monads haskell-pipes

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

1 个答案:

答案 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