在递归方案中组合非分配单子

问题描述

关于 Haskell 中的递归方案,我最喜欢的一件事是广义态射(gcata 等),它允许使用 monad 转换器库将(共)monadic 计算与递归进行交错。例如,如this 精彩博文中所述。

但是,我遇到了一个问题;为了能够使用这些函数,我们需要(co-)monads 是(co-)可排序的。考虑 gana 的类型签名:

gana : Monad m => (forall z . m (f z) -> f (m z)) -> (a -> f (m a)) -> a -> b

一个参数本质上是说 m 必须有一个 sequence 运算符。

不幸的是,我发现在实践中,有些 monad 是分布式的。例如:

  • 表示数据库事务的 monad。中止时,事务可以回滚;如果已排序,则只能回滚到排序的点。
  • 并发 monad,表示对资源的锁定或原子计算。排序后,锁定会暂时丢失。

在这种情况下,仍然可以编写交错执行 monadic 的 a specialised recursion scheme;但是你失去了使用 monad 变压器融合它的能力。即,如果您想将此类非分配 monad 组合在一起,则不能使用转换器将它们与 f-(co) 代数中的 monad/comonad 融合。具体来说,我无法使用 monad 转换器将 DBTransaction monad 与 apomorphism (ExceptT/EitherT) 结合起来;我需要从头开始编写自定义递归方案。

我的问题是是否有人有解决此限制的建议。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)