scala - 解释 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)
。
这部法律有何意义?
解决方案
如果您对语法感到困惑并且无法看到与 的类比(a+(b+c))==((a+b)+c)
,请考虑组合类型为A => M[B]
whereA
和B
can 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
推荐阅读
- apache-spark - 使用 pyspark `map` 函数时如何忽略空列表?
- modelica - 使用 FluidPort 时有关 C_outflow[] 的错误
- php - 无法将特殊字符插入 MySQL 表
- r - 计算 100 个 MLE 以找到估计量的平均值
- php - base64_encode 的问题,它减慢了我的网站 php
- android - android 画布画线,两边都有指针结束的箭头。谁能帮帮我。?
- python - 配置解析器没有返回正确的变量 - 在单词周围省略 ( )
- php - 如何使用 PHP 每分钟向电报机器人发送通知?
- python - 使用列表的值更新嵌套字典
- c++ - C++ With Initializer List 一个东西,什么时候用普通的构造函数?