我不能完全解释法律,但我想我可以提供一些见解。
让我们忘记那个方程的单子部分,假设f,h :: A -> A 是普通的非单子函数。然后,法律将(非正式地)简化为以下内容:
fix (h . f) = h (fix (f . h))
这是不动点理论中的一个众所周知的性质,前段时间我discussed in CS.SE。
不过,非正式的直觉是,g :: A->A 的最小固定点可以写成
fix g = g (g (g (g ....))))
g 被应用“无限多次”。在这种情况下,当g 是像h . f 这样的组合时,我们得到
fix (h . f) = h (f (h (f (h (f ...)))))
同样,
fix (f . h) = f (h (f (h (f (h ...)))))
现在,由于两个应用程序都是无限的,如果我们在第二个应用程序之上应用h,我们希望获得第一个应用程序。在周期数中,4.5(78) 与 4.57(87) 相同,因此同样适用。在公式中,
h (fix (f . h)) = fix (h . f)
这正是我们想要的规律。
使用 monad,我们不能像 f :: A -> M B 和 h :: B -> A 那样轻松地组合事物,因为我们需要在这里和那里使用 fmap,当然还有 mfix 而不是修复。我们有
fmap h . f :: A -> M A
f . h :: B -> M B
所以两者都是mfix 的候选者。要在mfix 之后应用“顶级”h,我们还需要fmap,因为mfix 返回M A。然后我们得到
mfix (fmap h . f) = fmap h (mfix (f . h))
现在,上述推理并不完全严谨,但我相信它可以在领域理论中适当地形式化,因此即使从数学/理论的角度来看也是有意义的。