[TOC]
看了很多函数式编程的介绍,来一波笔记
大佬阿隆佐在图灵那一代发明了,阿隆佐设计了一个名为lambda演算的形式系统。这个系统实质上是为其中一个超级机器设计的编程语言。在这种语言里面,函数的参数是函数,返回值也是函数。这种函数用希腊字母lambda(λ),这种系统因此得名
函数式编程
lanbda演算在最初设计时就是为了研究计算相关的问题,所以函数式编程也是为了解决计算问题.用java实验一下函数fp
这意味着简单的计算也是函数,变量也是函数完成的;
如果设置在java中的变量是final的,那么如何使用函数保存状态呢,毕竟变量不可改变,那就使用函数参数栈,进行调用即可.那就说函数式编程的就只有返回值有影响,而返回值又根据函数参数的影响.
String reverse(String arg) {
if(arg.length == 0) {
return arg;
}
else {
return reverse(arg.substring(1, arg.length)) + arg.substring(0, 1);
}
}
这样的函数想象一下,外部的值不能改变,函数也可以保证正确性,这样根本不用担心并发问题,毕竟只是函数内部的变量,函数外部的值不改变,不需要锁什么的.(但是就缺少扩展性了)
热更新问题:函数式编程没有对象和实例,例如java当程序运行时,要把实例给关掉,然后改代码再重新生成(说不定还要序列化保存实例的状态).FP的程序中所有状态就是传给函数的参数,而参数都是储存在栈上的。这一特性让软件的热部署变得十分简单。只要比较一下正在运行的代码以及新的代码获得一个diff,然后用这个diff更新现有的代码,新代码的热部署就完成了
– 高阶函数:当使用c类似的函数声明和定义时,却可以想java一样,在对象中传递包含该函数的对象当参数,而且还不用实例化对象,
- 代码优化:函数式怎么使只会影响返回结果,这样可以安排代码执行顺序从而实现更高的执行效率甚至减少错误,
- 用CPS风格写出来的程序不需要栈,但是每次调用函数的时候都会要多加一个参数后续传递风格(continuation-passing style–cps)
java
发达的
阿什顿飞
Function makePowerFn(int power) {
int powerFn(int base) {
return pow(base, power);
}
return powerFn;
}
Function square = makePowerFn(2);
square(3); // returns 9
发表回复