首页 > 解决方案 > 解释 flatMap 关联性

问题描述

我正在阅读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)

这部法律有何意义?

标签: scalafunctional-programming

解决方案


如果您对语法感到困惑并且无法看到与 的类比(a+(b+c))==((a+b)+c),请考虑组合类型为A => M[B]whereABcan change whileM保持不变的函数。现在考虑一个像这样组成这些函数的操作:

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))

如果我们有一些中缀运算符 for compose,它可能看起来像这样:

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

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


推荐阅读