解释flatMap关联性

问题描述 投票:1回答:1

我正在阅读Functional Programming in Scala,并在书中指出,monad的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)的结果。

该法律的意义是什么?

scala functional-programming
1个回答
0
投票

如果您对语法感到困惑,并且无法看到类似于(a+(b+c))==((a+b)+c)的内容,请考虑编写A => M[B]类型的函数,其中AB可以更改,而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)
© www.soinside.com 2019 - 2024. All rights reserved.