返回

打造属于自己的underscore系列(五)- 偏函数和函数柯里化

前端

在javascript的函数式编程中,偏函数应用和函数柯里化是两个重要的概念。理解这两个概念之前,我们需要先知晓什么是函数式编程? 函数式编程是一种编程风格,它可以将函数作为参数传递,并返回没有副作用的函数。而什么是偏函数应用(partial application)和函数柯里化(curry)?

  • 偏函数应用 是指将一个函数的部分参数预先指定好,得到一个新的函数,这个新函数的参数个数比原函数少。偏函数应用可以提高代码的可重用性。例如,我们可以定义一个函数 add,它接受两个参数并返回它们的和。然后,我们可以使用偏函数应用来创建一个新的函数 add10,它接受一个参数并返回该参数与10的和。add10 函数可以被多次使用,而无需重新编写 add 函数。

  • 函数柯里化 是指将一个多参数函数转换为一系列单参数函数的过程。函数柯里化可以使代码更易于理解和维护。例如,我们可以定义一个函数 max,它接受两个参数并返回较大的那个。然后,我们可以使用函数柯里化来创建一个新的函数 maxWith10,它接受一个参数并返回该参数与10的较大值。maxWith10 函数可以被多次使用,而无需重新编写 max 函数。

偏函数应用和函数柯里化都是函数式编程的重要技术,它们可以使代码更易于重用、理解和维护。下面是一个具体的例子,说明如何使用偏函数应用和函数柯里化来解决实际问题:

假设我们有一个数组 numbers,其中包含一些数字。我们想找到数组中最大的数字。我们可以使用函数 max 来解决这个问题:

function max(a, b) {
  return a > b ? a : b;
}

const numbers = [1, 2, 3, 4, 5];
const largestNumber = numbers.reduce(max);
console.log(largestNumber); // 5

然而,如果我们想找到数组中所有大于某个特定值的数字,我们就需要使用偏函数应用来创建一个新的函数 maxWith10

const maxWith10 = max.bind(null, 10);

const filteredNumbers = numbers.filter(maxWith10);
console.log(filteredNumbers); // [4, 5]

maxWith10 函数接受一个参数,并返回该参数与10的较大值。我们使用 bind 方法来将 max 函数的部分参数预先指定好,这样我们就得到一个新的函数 maxWith10,它只需要一个参数。然后,我们可以使用 filter 方法来过滤数组 numbers,只保留那些大于10的数字。

函数柯里化也可以用于解决同样的问题:

function maxWith10Curried(x) {
  return function(y) {
    return max(x, y);
  };
}

const filteredNumbers = numbers.filter(maxWith10Curried(10));
console.log(filteredNumbers); // [4, 5]

maxWith10Curried 函数接受一个参数 x,并返回一个新的函数,该函数接受另一个参数 y,并返回 xy 的较大值。我们使用 filter 方法来过滤数组 numbers,只保留那些大于10的数字。

偏函数应用和函数柯里化都是函数式编程的强大工具,它们可以使代码更易于重用、理解和维护。在本文中,我们介绍了偏函数应用和函数柯里化的基本概念,并通过一个具体的例子说明了如何使用它们来解决实际问题。