Skip to content

函数式编程

🕒 Published at:

什么是函数式编程?

函数式编程是一种古老的编程思想,它要求所有的代码功能都尽量使用没有副作用的纯函数来实现。它是和面向对象编程相对的一种编程思路。

没有副作用是指不会对函数之外的状态造成影响,相同的参数始终返回相同的结果,函数的输出只依赖于函数的输入。

函数式编程的两个基本运算

函数合成和函数柯里化

函数合成

函数合成,英文为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
}

函数式编程如何处理副作用?

处理副作用的原则是将其带来的不确定性限制在一定范围内,让其它部分得以保持纯函数的特性。

  1. 依赖注入,即将副作用部分,剔除出去作为参数。将副作用“浮”起来。
  2. 使用惰性函数,即将副作用部分包裹起来,只有当最终需要用到副作用部分的时候,才对这部分进行处理。将副作用“沉”下去

函数式编程的优势和劣势?

优势

  1. 代码更加健壮,稳定,可靠;
  2. 代码如果出现bug,方便快速定位;
  3. 方便测试,编写测试用例相对简单。

劣势

  1. 由于其大部分情况需要实现无副作用的要求,可能会有额外的性能开销;
  2. 在某些情况下,编写代码实现纯函数比较困难。

参考文章

阮一峰-函数式编程入门函数式编程中如何处理副作用