Monads是什么
知乎里有关于什么是Monad的问题讨论,而在维基百科中也有关于Monad的释义。作为初次接触到Monads概念,难免会有些晕头转向,也难免会有些畏惧(因为Monads和数学中的范畴论有密切关系),但是Monads又是如此的重要,因为它在函数式编程中实在是应用太广泛了,并且在Scala的标准库中又常常遇到,使得我们不得不好好研究一番。
Monoids
Monoids是一种元素的集合,它需要满足结合律和幺元(Identity,也称为单位元,这种元和其他元素结合时,不会改变那么元素)这些约束条件。
比如:
- 整数类型Int,其中0是Identity,其中的任何整数满足结合律
- 列表类型List,任何两个列表可以通过
:::
连接起来,其中Nil或空列表[]是Identity- 字符串类型String,两个字符串可以拼接,其中空字符串或”“是Identity
Monoids在平常的编程之中无处不在,当用到一个列表,连接字符串,通过一个循环得到一个累加结果,都在使用到Monoids。
条件和定律
- 一个抽象类型A
- 一个二元结合性函数(binary associative function),对传入的两个A类参数进行操作后产生一个A类型结果。op操作必须是结合性的,即op(x, y) == op(y, x);op(a,op(b,c)) = op(op(a,b),c):这个定律是函数组合(function composition)不可缺的条件
- 一个恒等值(identity)。二元函数参数中如果有一个是恒等值时操作结果为另一个参数,即满足op(identity, x) == x
示例
Monoid可以用下面的代码描述