什么是函数式编程?
函数式编程是一种古老的编程思想,它要求所有的代码功能都尽量使用没有副作用的纯函数来实现。它是和面向对象编程相对的一种编程思路。
没有副作用是指不会对函数之外的状态造成影响,相同的参数始终返回相同的结果,函数的输出只依赖于函数的输入。
函数式编程的两个基本运算
函数合成和函数柯里化
函数合成
函数合成,英文为compose,即将多个函数组合起来实现一个功能。其形式为将一个参数传入前一个函数,前一个函数执行后将其返回结果,作为后一个函数的参数传入,以此类推,形成一个类似管道的结构,因此函数合成有时也称函数管道。
通用的compose函数实现:
ts
function componse(): Function {
const args = Array.from(arguments)
return function (val: unknown) {
return args.reduce((result, func) => {
return func(result)
}, val)
}
}函数合成要求所有组合的函数必须是纯函数,且都只有一个参数。 都只有一个参数是因为JS函数只能有一个返回值,而函数合成要求多个函数首尾相连,因此所有参与组合的函数都只能有一个参数。
函数柯里化
函数柯里化,英文为currying,作用是按照顺序固定函数的某些参数,可以实现将多参数的函数转为少参数的函数,或者单参数的函数。
通用的curry函数实现:
typescript
function curry(fn: Function): unknown {
const g = (...allArgs: unknown[])=>{
if(allArgs.length >= fn.length){
return fn(...allArgs)
}else{
return (...args) => g(...allArgs, ...args)
}
}
return g
}函数式编程如何处理副作用?
处理副作用的原则是将其带来的不确定性限制在一定范围内,让其它部分得以保持纯函数的特性。
- 依赖注入,即将副作用部分,剔除出去作为参数。将副作用“浮”起来。
- 使用惰性函数,即将副作用部分包裹起来,只有当最终需要用到副作用部分的时候,才对这部分进行处理。将副作用“沉”下去
函数式编程的优势和劣势?
优势
- 代码更加健壮,稳定,可靠;
- 代码如果出现bug,方便快速定位;
- 方便测试,编写测试用例相对简单。
劣势
- 由于其大部分情况需要实现无副作用的要求,可能会有额外的性能开销;
- 在某些情况下,编写代码实现纯函数比较困难。