特别地,我希望它们与分配律相关,但它们似乎确实有所不同:单子变换器预期适用于任意单子,而分配律则涉及一个单子和另一个指定的单子之间的关系。
此外,看着单子变换器的常见示例,虽然
MaybeT m
将m
与 Maybe
组合,但StateT m
在任何一种顺序中都不是 m
与 State
的组合。那么我的问题是:什么是范畴语言中的单子变换器?
MaybeT m
将m
与 Maybe
组合,但StateT m
在任何一种顺序中都不是 m
与 State
的组合。单子变换器并不是非常数学上愉快的。但是,我们可以从自由单子和更一般的理想单子中获得好的(c0)乘积:请参见 Ghani 和 Uustalu 的 "Coproducts of Ideal Monads":http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.4.2698
Monad transformer是单子范畴中的一个指向函子。
以下是更多细节:
从某个范畴开始,我们考虑那些是单子的自函子M。所有这些单子M形成一个范畴,其态射是满足单子态射定律的自然变换M -> M'。
在这个单子范畴中,Monad transformer是一个指向自函子。什么是单子范畴中的自函子T?这个自函子是从单子M到单子T(M)的映射,以及任何单子态射M -> M'到单子态射T(M) -> T(M')的映射。
如果存在从恒等自函子(Id)到T的自然变换,则自函子T是“指向”的。
身份函子是单子和单子态射的恒等映射。自然变换Id ~> T由其在所有单子M的分量定义。它在M处的分量是一个单子态射M -> T(M)。此外,必须有一个自然性定律(“单子自然性”),它表明对于任何单子M和M'以及任何单子态射M -> M',由M、M'、T(M)、T(M')组成的图表都是可交换的。
这些数据或多或少与单子变换器所需的通常数据重合。所需的单子态射M -> T(M)是将“外部”单子M提升到转换后的单子中。
构造还包括“举起”函数(这是端函子T对单子态射的作用),它将单子态射M -> M'提升为T(M) -> T(M')。
如果我们考虑单位自函子 T(Id) 的图像,这必须是另一个单子。将其称为变换器的“基础单子”并用 B 表示。然后,对于任何 M,我们有单子态射 B ~> T(M)。这是从基础单子到转换单子的提升。
然而,此定义排除了“非函子”的单子变换器,例如连续单子和密度单子。
分配律仅与某些单子变换器相关。存在两种类型的变压器,在这些变压器中,自然变换 Id ~> T 的 M 分量由 M -> B∘M 或 M ->M∘B 给出。但其他单子具有不是函子组合的变形器,并且对它们没有分配法则。
更多详细信息请参见即将推出的书籍《函数式编程科学》的第14章:https://github.com/winitzki/sofp