haskell - 我可以让 Control.Proxy 中的 StateP 成为 MonadState 的实例吗?

标签 haskell monads haskell-pipes

我正在更改一些曾经在 StateT 中运行的代码monad 在 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

我只想简要说明在 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

关于haskell - 我可以让 Control.Proxy 中的 StateP 成为 MonadState 的实例吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17258711/

相关文章:

haskell - 将计算与状态单子(monad)绑定(bind)?

haskell - 使用 IO 列表查找?

json - 在 Purescript 中的 AST 中输入信息

json - 在 Haskell 中将 JSON 字符串解析为记录

haskell - 实现 zipE::Event t a -> 事件 t b -> 事件 t (a,b)

haskell - 使用 - 在 haskell 中加入两个 IO

haskell - 如何在不使用记录语法的情况下实现 MonadState 类?

haskell - 管道 3.0 : non linear topologies

haskell - 在管道内运行消费者

haskell - 这种请求-响应类型是否有标准抽象?