相关概念:
1.代数系统:元素与函数的组合
2.函数是一种关系
3.群是一个二元代数系统
4.图是表达一个集合上二元关系的一种手段,用来处理离散数学模型的一个工具,对象就是结点,函数就是箭头
5.函子就是图到图的图同态,即是范畴到范畴的一种函数,它保恒等和结合,保持仍然是范畴
6.范畴是一个图,它带有两个满足恒等性和结合性的函数,identity、函数组合
7.自函子:映射到自身的
8.Monad:一个自函子范畴上的幺半群,当相同类型的嵌套时,可以通过自函子将函子里的数据“剥出来”
9.[幺半群][1]是一个带有二元运算: M × M → M 的集合 M ,其符合下列公理:
结合律:对任何在 M 内的a、b、c, (ab)c = a(bc) 。
单位元:存在一在 M 内的元素e,使得任一于 M 内的 a 都会符合 ae = e*a = a 。
9.applicative functor 简单来说Monad是context sensitive, 而Applicative是context free的。作为一个接口,它能为我们带来什么:那就是让不同 functor 可以相互应用(apply)的能力。是实现了ap方法的 pointed functor。F.of(x).map(f) == F.of(f).ap(F.of(x)
10.lift
``` javascript
var liftA2 = curry(function(f, functor1, functor2){returnfunctor1.map(f).ap(functor2);});
```
liftA2是个奇怪的名字,听起来像是破败工厂里挑剔的货运电梯,或者伪豪华汽车公司的个性车牌。不过你要是真正理解了,那么它的含义也就不证自明了:让那些小代码块发生 lift,成为 applicative functor 中的一员。
特性:
1.范畴中的所有元素,都拥有自函子,或者可以将一个对象看为自函子。
相关应用:
1.一个函数式语言有:
1)原始数据类型
2)每个类型的常量(单位元)
3)运算,相当于代数系统中的函数
4)构造器,它们可以作用到数据类型和运算以产生导出的数据类型和运算
语言由从原始数据类型和原始运算能导出的所有的运算和类型的集合组成。
2.结合1中的描述,函数式语言的数据是不可变的,因为我们只需要获得数据映射之后的结果,如果可以变化,那么就不是函数式了,就变成了混沌态编程;
所以也不能自己赋值变量,也不存在变量这个说法;
函数和元素都作为最基本的元素,但是在应用中,我们只能通过对范畴的各种操作(函子,或者单纯元素间的函数)来组合出我们想要的功能,所以函数是“一等公民”。
3.范畴学最厉害的地方就是组合,对任何链接的对象组,a->b->c 一定有存在一个组合可以直接 a -> c
对于函数式编程,最精髓的地方就是函数组合,通过组合函数,完成更加抽像复杂的函数。
感悟:
我们太多的被命令式语言毒害了,在以后的实践中,多利用函数式,我们应该多考虑问题本身,而不是在如何实现方面。
目前在函数式中,有多种做法,因为对范畴的理解也不经相同,想更加了解函数式编程应该去,用一下Haskell,因为它已经有很久的历史了,也统一了很多标准,有用的留下,没用的废弃,当我们用Haskell完成几个项目之后,能更有所了解。