前言
最近刚接触到函数式编程
这个术语,很迷惑。然后在jdk1.8里面也有看到一些函数式编程的代码块,难以理解,所以啦,在我一顿百度谷歌操作之后,总算对这个概念有了一点了解了,写这篇博文的目的主要是理一下思路,便于后续复习。
历史
在数学的发展史上,针对category theory
出现了一整套函数的运算方法,这个方法被用于编程就是现在的函数式编程。所以函数式编程的本质是数学的运算方法。
我们都知道,数学的原始目的是求值。我理解的数学就是:给你一些条件,然后我需要一个结果,过程是怎样我是不管的。所以函数式编程的目的就是求值
。
PS:好好理解求值
这个目的,理解了这个,函数式编程就很好理解了。
关于函数式编程的理解
- 函数式编程是跟面向对象编程和面向过程编程属于同一个层次的编程范式
- 函数是第一等公民
- 只有纯的,没有副作用的函数才是合格的函数
- 函数可以接受函数当作输入和输出
刚看到函数式编程的等级竟然是跟面向对象和面向过程是属于同一个等级的时候,很是讶异,没想到函数式编程是这么高级的东西。
函数的合成
如果一个结果需要经过多个函数计算才能得到,那么将这多个函数合并成一个函数就是函数的合成。
y = f(x);
z = g(y);
// 那么,这里的g(f(x))就是函数f和函数g的合成
z = g(f(x))
柯里化
柯里化就是将一个有多个参数的函数分解成多个单参函数的过程。
k = add(x, y) {
return x + y;
}
// 那么,将这两个参数的函数分解一下,分成需要两次传参的
// 注意,这里的function只是代表着它是一个函数,并不是指函数名,你可以将之理解为匿名函数
k = function(x) {
return function(y) {
return x + y;
}
}
// 所以
add (x, y) = function (x) (y)
类似这样的分解过程就是柯里化。
PS:看到这里对柯里化不太理解的同学,可以百度谷歌一波,多看看不同人的解释,这样有助于理解陌生的概念。
函子
- of 差不多相当于面向对象中的new关键字吧
- map 映射,从一个容器或者说种类变换为另一个容器
- maybe 处理空值 null
- either 类似于if…else的逻辑
- ap 参数是函子
- monad 将多层嵌套的函子铺平