函数式编程是一种编程范式,常见的编程范式有函数式编程
,命令式编程
。
命令式编程
是面向计算机硬件的抽象,有变量,赋值语句,表达式和控制语句,其实就是一个指令序列。
函数式编程
是面向数学的抽象,将计算描述为一种表达式求值,感觉就是函数式程序就是一个表达式。
本质
函数式编程中的函数这个术语不是指计算机中的函数,而是指数学中的函数,即自变量的映射。也就是说一个函数的值仅决定于函数参数的值,不依赖其他状态。比如sqrt(x)函数计算x的平方根,只要x不变,不论什么时候调用,调用几次,值都是不变的。
举个例子:
[(5+2)-3]*2
传统的过程式变成会这样写:
const a = 5+2;
const b = a-3;
const c = b*2;
那我们的函数式编程应该怎么写呢:
function add(a,b){
return a+b;
}
function subtract(a,b){
return a-b;
}
function multiply(a,b){
return a*b;
}
let result = multiply(subtract(add(5,2),3),2);
特点
- 函数是"第一等公民"
指的是函数可以在任何地方定义,在函数内或函数外,可以作为函数的参数和返回值,可以对函数进行组合。 - 只用"表达式",不用"语句"
"表达式"(expression)是一个单纯的运算过程,总是有返回值;"语句"(statement)是执行某种操作,没有返回值。函数式编程要求,只使用表达式,不使用语句。也就是说,每一步都是单纯的运算,而且都有返回值。 - 没有"副作用"
所谓"副作用",指的是函数内部与外部互动(最典型的情况,就是修改全局变量的值),产生运算以外的其他结果。
函数式编程强调没有"副作用",意味着函数要保持独立,所有功能就是返回一个新的值,没有其他行为,尤其是不得修改外部变量的值。 - 不修改状态
函数式编程只是返回新的值,不修改系统变量。 - 引用透明
引用透明,指的是函数的运行不依赖于外部变量或"状态",只依赖于输入的参数,任何时候只要参数相同,引用函数所得到的返回值总是相同的。
好处
- 方便代码管理
函数既不依赖外部的状态也不修改外部的状态,函数调用的结果不依赖调用的时间和位置,这样写的代码容易进行推理,不容易出错。这使得单元测试和调试都更容易。 - 易于“并发”
由于(多个线程之间)不共享状态,不会造成资源争用(Race condition),也就不需要用锁来保护可变状态,也就不会出现死锁,这样可以更好地并发起来,尤其是在对称多处理器(SMP)架构下能够更好地利用多个处理器(核)提供的并行处理能力。 - 代码简洁易于理解
由于函数式语言是面向数学的抽象,更接近人的语言,而不是机器语言,代码会比较简洁,也更容易被理解。
网友评论