我正在阅读Functional Programming in Scala
书,书中评论说,monads 的 flatMap 必须遵循以下结合律。
x.flatMap(f).flatMap(g) == x.flatMap(a => f(a).flatMap(g))
我通常将结合性理解为(a+(b+c))
==((a+b)+c)
,但我未能将这里的等式转换为类似的东西。
双方似乎等同于我。假设x是M[A]
类型,它们似乎都首先将f
应用于a
,然后将flatMap(g)
应用于f(a)
的结果。
这部法律的意义是什么?
如果您对语法感到困惑并且难以看到与(a+(b+c))==((a+b)+c)
的类比,请考虑组合类型A => M[B]
的函数,其中A
和B
可以更改,而M
保持不变。现在考虑一个由这些函数组成的操作,如下所示:
def compose[A,B,C](f: A => M[B], g: B => M[C]): A => M[C] =
a => f(a).flatMap(g)
现在结合性定律是这样的:
compose(compose(f, g), h) == compose(f, compose(g, h))
如果我们有一些compose
的中缀运算符,它可能看起来像这样:
(f comp g) comp h == f comp (g comp h)
顺便说一句:在函数式编程术语中,这些函数称为 Kleisli