函数式编程之函数柯里化与合成函数

284 阅读2分钟

鲸鱼.jpeg

什么是函数编程?

函数式编程是一种编程范式。

函数式是一等公民,它有三个特性:
  1. 可以被赋值为变量
  2. 可以作为参数
  3. 可以作为返回值
学习函数式编程的意义在于:
  1. 抽象我们可以屏蔽的细节,只需要关注我们的目标。
  2. 用来抽象通用问题。
  3. 代码可以变得简洁。
而函数式编程有2个最基本的运算:柯里化(currying) 和 合成函数(compose) 下面我们一起看下吧。

函数柯里化

把接收多个参数的函数变换成接收一个单一参数的函数,并且返回接收余下的参数而且返回结果的新函数技术,这就叫函数柯里化(currying)

原始执行

function add(x, y) {
  return x + y
}
// 原始执行
add(2, 3) // 5

柯里化执行

// 柯里化执行
function add(x) {
  return function (y) {
    return x + y
  }
}
​
let increment = add(1)
let addTen = add(10)
​
increment(2) // 3
addTen(2) // 12

柯里化函数可以在下次执行函数的时候利用闭包特性记录函数的第一个参数进行执行。一次性调用它实在是有点繁琐,使用柯里化来帮助函数使这一类函数的定义和调用更加容易。提高函数的适用性,我们可以想用什么功能就传递什么参数,根据传入参数的数量实现函数的随取随用。增加了代码的复用性。

合成函数

如果一个值要经过多个函数,才能变成另外一个值,就可以把所有的中间步骤合并成一个函数,这就叫函数的合成(compose)

原始执行

function f1(arge) {
  console.log('f1', arge)
  return arge
}
​
function f2(arge) {
  console.log('f2', arge)
  return arge
}
​
function f3(arge) {
  console.log('f3', arge)
  return arge
}
// 原始执行
f1('hello')
f2('hello')
f3('hello')
​
// 打印结果: f1 hello, f2 hello, f3 hello

合成执行

function f1(arge) {
  console.log('f1', arge)
  return arge
}
​
function f2(arge) {
  console.log('f2', arge)
  return arge
}
​
function f3(arge) {
  console.log('f3', arge)
  return arge
}
​
// 合成执行
function compose(...funs) {
  if (funs.length === 0) {
    return arg => arg
  }
​
  if (funs.length === 1) {
    return funs[0]
  }
​
  return funs.reduce((a, b) => (...args) => a(b(...args)))
}
​
compose(f3, f1, f1)('hello') // f3(f2(f1('hello')))// 打印结果: f1 hello, f2 hello, f3 hello

合成函数不担心函数的参数是多少,利用es6的扩展运算符转化为函数数组,在使用reduce进行合成。reduce函数接收一个函数作为参数,这个函数的第一个参数a就是当前执行的函数,b参数就是下一个要执行的函数,reduce函数返回一个函数是调用的时候再传递参数。如:hello。

合成函数的好处显而易见,它让代码变得简单而富有可读性,同时通过不同的组合方式,我们可以轻易组合成其他常用函数,让我们的代码更具表现力。