Yar*_*ner 1 functional-programming scala
我正在阅读,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]在其中保持不变的情况下编写类型为where A且B可以更改的函数M。现在考虑一个包含以下功能的操作:
def compose[A,B,C](f: A => M[B], g: B => M[C]): A => M[C] =
a => f(a).flatMap(g)
Run Code Online (Sandbox Code Playgroud)
现在,关联律如下:
compose(compose(f, g), h) == compose(f, compose(g, h))
Run Code Online (Sandbox Code Playgroud)
如果我们有一些infix运算符compose,它可能看起来像这样:
(f comp g) comp h == f comp (g comp h)
Run Code Online (Sandbox Code Playgroud)
顺便说一句:在函数式编程术语中,这些函数称为Kleisli
| 归档时间: |
|
| 查看次数: |
49 次 |
| 最近记录: |