Scala 平面映射结合性的解释

Scala 平面映射结合性的解释,scala,functional-programming,Scala,Functional Programming,我正在阅读Scala中的函数式编程以及书中的注释,即单子的flatMap必须遵循如下的关联性定律 x、 flatMapf.flatMapg==x.flatMapa=>fa.flatMapg 我通常认为结合性的意思是a+b+c==a+b+c,但我没能把这里的等式转换成类似的东西 这两个方面对我来说似乎相当。假设x是M[A]类型,它们似乎都首先将f应用于A,然后将flatmappg应用于fa的结果 这个定律的意义是什么? < P>如果你被语法混淆了,很难看到与A+B+C==A+B+C的类比,考虑A+

我正在阅读Scala中的函数式编程以及书中的注释,即单子的flatMap必须遵循如下的关联性定律

x、 flatMapf.flatMapg==x.flatMapa=>fa.flatMapg

我通常认为结合性的意思是a+b+c==a+b+c,但我没能把这里的等式转换成类似的东西

这两个方面对我来说似乎相当。假设x是M[A]类型,它们似乎都首先将f应用于A,然后将flatmappg应用于fa的结果


这个定律的意义是什么?

< P>如果你被语法混淆了,很难看到与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))
如果我们有一些用于合成的中缀运算符,它可能如下所示:

(f comp g) comp h == f comp (g comp h)

BTW:在函数式编程术语中,这些函数被称为

如果你被语法混淆了,并且很难看到与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))
如果我们有一些用于合成的中缀运算符,它可能如下所示:

(f comp g) comp h == f comp (g comp h)

顺便说一句:在函数式编程术语中,这些函数在LHS上被称为

,在第一次应用g之前,f已应用于x的所有元素。在RHS上,在处理x的下一个元素之前,先应用f,然后应用g。这就是我读它的方式,尽管很难想象任何平面图都会通过这个测试。在LHS上,在第一次应用g之前,f已经应用于x的所有元素。在RHS上,在处理x的下一个元素之前,先应用f,然后应用g。我就是这样读的,尽管很难想象任何一个平面地图都能通过这个测试。啊,谢谢!好的,当组成的元素类型为A=>M[B]时,这对我来说是有意义的。我不太确定它在原始示例中是如何工作的,虽然x.flatMapf.flatMapg,这意味着x也是类型A=>m[A],啊,谢谢!好的,当组成的元素类型为A=>M[B]时,这对我来说是有意义的。我不太确定它在原始示例中是如何工作的,尽管x.flatMapf.flatMapg,这意味着x也是类型A=>m[A]的?