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

关于 Haskell 中的递归方案,我最喜欢的事情之一是广义态射(gcata等),它允许使用 monad 转换器库将(共)monadic 计算与递归交错。例如,如这篇很棒的博客文章中所述。

但是,我遇到了一个问题;为了能够使用这些函数,我们需要(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 执行;但是你失去了使用 monad 变压器融合它的能力。即,如果您想将此类非分配 monad 组合在一起,则不能使用转换器将它们与 f-(co) 代数中的 monad/comonad 融合。具体来说,我不能使用 monad 转换器将DBTransactionmonad 与 apomorphism ( ExceptT/EitherT)结合起来;我需要从头开始编写自定义递归方案。

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

以上是在递归方案中组合非分配单子的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>