函数式编程,高阶函数,纯函数,函数柯里化
函数式编程
百科定义:
函数式编程是种编程方式,它将电脑运算视为函数的计算。函数编程语言最重要的基础是λ演算(lambda calculus),而且λ演算的函数可以接受函数当作输入(参数)和输出(返回值)。
个人理解就是我们的编程是以函数作为单元来处理各个业务逻辑,函数既可以当做参数传来传去,也可以作为返回值,可以把函数理解一个值到另一个值得映射关系,由于函数式编程方式更适合于数据处理,随着存储器容量升高、计算机处理能力大幅提高,它的优势更加明显,最近支持函数式编程的语言也逐渐流行,比如python、scale等都因它们对函数式编程的支持被人们重视,从被遗忘的角落重新拾起。
函数式编程因为其特点更适用于统计分析数据、科学计算、大数据处理等方面工作,当然并不限于这些,在web开发、服务器脚本等其它方面也很不错,而面向对象编程更适合于开发和处理业务性强、功能模块完备的大型业务系统。
编程语言主要有三种类型[3]:
命令式编程(Imperative Programming): 专注于”如何去做”,这样不管”做什么”,都会按照你的命令去做。解决某一问题的具体算法实现。
函数式编程(Functional Programming):把运算过程尽量写成一系列嵌套的函数调用。
逻辑式编程(Logical Programming):它设定答案须符合的规则来解决问题,而非设定步骤来解决问题。过程是事实+规则=结果。
===========
高阶函数
高阶函数的英文名叫 Higher-Order Function,熟悉 React 的朋友应该知道高阶组件 Higher-Order Component。没错,React 的高阶组件本质上就是高阶函数。
那么,什么是高阶函数呢?
高阶函数源自于函数式编程(不熟悉的朋友请看《javascript中的函数式编程》),是函数式编程的基本技术。
那么,JS作为一门“一切皆为对象”的语言,是如何拥有函数式编程的能力呢?
是因为在JS中函数是一等公民,即函数可以被赋值给变量,被变量引用,这便使得函数可以作为参数,在其他函数间相互传递:
/**
* 数值转换
* @param {Number} val 要被处理的数值
* @param {Function} fn 处理输入的val
* @return {Number || String}
*/
const toConvert = function(val, fn) {
return fn(val);
};
const addUnitW = function(val) {
return val + 'W';
};
toConvert(123.1, Math.ceil); // 124
toConvert(123.1, addUnitW); // "123.1W"
另外,JS的回调函数同样是以实参形式传入其他函数中,这也是高阶函数(在函数式编程中回调函数被称为 lambda表达式):
[1, 2, 3, 4, 5].map(d => d ** 2); // [1, 4, 9, 16, 25]
// 以上,等同于:
const square = d => d ** 2;
[1, 2, 3, 4, 5].map(square); // [1, 4, 9, 16, 25]
纯函数是函数式编程中非常重要的一个概念,简单来说,就是一个函数的返回结果只依赖于它的参数,并且在执行过程中没有副作用,我们就把这个函数叫做纯函数。
const a = 1
const pure = (x, b) => x + b
pure(1,2) //3
现在,pure
的返回结果只依赖于它的参数x
和b
,就是说,只要代码不变,pure(1, 2)
的返回值永远是3。
纯函数仅依赖于传入的参数,这意味着你可以随意将这个函数移植到别的代码中,只需要提供踏需要的参数即可。如果是非纯函数,有可能你需要一根香蕉,却需要将整个香蕉树搬过去。
2. 可测试性纯函数非常容易进行单元测试,因为不需要考虑上下文环境,只需要考虑输入和输出。
3. 并行代码纯函数是健壮的,改变执行次序不会对系统造成影响,因此纯函数的操作可以并行执行。
==============例如有一个简单的加法函数,他能够将自身的三个参数加起来并返回计算结果。
function add(a, b, c) {
return a + b + c;
}
那么add函数的柯里化函数_add则可以如下:
function _add(a) {
return function(b) {
return function(c) {
return a + b + c;
}
}
}
下面的运算方式是等价的。
add(1, 2, 3);
_add(1)(2)(3);
作者:这波能反杀
链接:https://www.jianshu.com/p/5e1899fe7d6b
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。