📜  函数式编程-记录(1)

📅  最后修改于: 2023-12-03 15:22:37.423000             🧑  作者: Mango

函数式编程-记录

函数式编程(Functional Programming,简称 FP)是一种编程范式,可以在代码中创造更多干净、优雅和可读性强的结果。它是声明式的,意味着将重点放在函数定义和它们的组合上,而不是对每一步的处理进行明确的指令。在本文中,我们将介绍函数式编程的一些基本概念和例子,以及它们如何帮助我们编写更好的代码。

纯函数

FP 最基本的概念是“纯函数”。纯函数是指在无副作用的情况下,根据输入参数来返回值的函数。

举个例子,下面的函数就是一个纯函数:

function add(a, b) {
  return a + b;
}

这个函数只依赖于它的输入参数,并且不会改变任何外部状态。纯函数通常是可重复和可预测的,因为相同的输入总是返回相同的输出。这个概念在 FP 中非常重要,因为它允许我们编写更易于测试和维护的代码。

不可变性

不可变性(Immutability)是指变量的值在创建之后不会再改变。在 FP 中,不可变性是非常重要的,因为它可以避免许多常见的问题,例如并发将变量的值改变而导致的竞态条件。FP 推崇的是创建新的不可变对象,而不是对原有对象进行修改。

举个例子,下面的代码展示了如何创建一个不可变的数组:

const array = [1, 2, 3];
const newArray = [...array, 4]; // 创建了一个新的数组

在上面的例子中,我们使用了展开运算符来创建一个包含原有数组值的新数组,然后我们将它添加了一个新的值。因为我们没有修改原有数组,而是创建了一个新的数组,所以我们确保了不可变性。

常用的函数式编程操作
映射(Map)

“映射”指的是根据给定的转换规则对元素进行转换并返回一个新数组。在 JS 中,可以使用 Array.map() 函数进行映射操作。

const array = [1, 2, 3];
const newArray = array.map((x) => x * 2); // [2, 4, 6]

在上面的例子中,我们使用了 Array.map() 函数将原有数组中的每个元素乘以 2 并返回新数组。

过滤(Filter)

“过滤”指的是根据给定的条件来排除或保留特定的元素,并返回一个新数组。在 JS 中,可以使用 Array.filter() 函数进行过滤操作。

const array = [1, 2, 3, 4, 5];
const newArray = array.filter((x) => x % 2 === 0); // [2, 4]

在上面的例子中,我们使用了 Array.filter() 函数将原有数组中的偶数元素筛选出来并返回新数组。

折叠(Reduce)

“折叠”指的是将一个数组的所有元素通过一个累加器进行迭代,并返回一个最终的累加结果。在 JS 中,可以使用 Array.reduce() 函数进行折叠操作。

const array = [1, 2, 3];
const sum = array.reduce((accumulator, currentValue) => accumulator + currentValue); // 6

在上面的例子中,我们使用了 Array.reduce() 函数将原有数组中的所有元素相加并返回最终累加结果。

组合

在 FP 中,组合是一种常见的操作,它允许我们通过将多个小的函数合并成一个更大的函数来创建更强大的函数。由于纯函数是无副作用的,它们也更容易组合。

举个例子,我们可以使用组合功能将上面的映射和折叠操作组合成一个新的函数,然后使用它来计算数组中所有偶数元素的总和:

const array = [1, 2, 3, 4, 5];
const sumOfEvenNumbers = array.filter((x) => x % 2 === 0).reduce((accumulator, currentValue) => accumulator + currentValue); // 6

在上面的例子中,我们首先过滤出所有偶数,然后将它们相加并返回。

总结

函数式编程是一种非常强大的编程范式,可以帮助我们编写更干净、简洁、可靠的代码。在本文中,我们了解了一些 FP 的基本概念和例子,例如纯函数、不可变性、映射、过滤、折叠和组合。通过使用这些概念和技术,我们可以创造更加优美和可读性强的代码。