纯函数:函数式编程入门
Posted 做工程师不做码农
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了纯函数:函数式编程入门相关的知识,希望对你有一定的参考价值。
纯函数是所有函数式编程语言中使用的概念,这是一个非常重要的概念,因为它是函数式编程的基础,它允许你创建简单和复杂的组合模式。
纯函数背后的数学术语我就不说了,我直接说说说它们是什么以及它们的样子。
你可以确定满足以下条件的函数是纯函数:
-
它应始终返回相同的值。不管调用该函数多少次,无论今天、明天还是将来某个时候调用它。 -
自包含(不使用全局变量)。 -
它不应修改程序的状态或引起副作用(修改全局变量)。
第一个条件:应始终返回相同的值
以以下功能为例
Math.cos(0) // 1
无论今天,明天还是将来某个时间调用 Math.cos(0)
都没关系,输出始终为1
。我们来看一个新的例子
const numberOfApples = 5;
const applesBought = 5;
const add = (num1, num2) => num1 + num2;
const totalApples = add(numberOfApples, applesBought) // 10
const totalApples = add(numberOfApples, applesBought) // 10
// ... one month later
const totalApples = add(numberOfApples, applesBought) //10
add函数也会发生同样的事情,不管调用该函数多少次或何时调用该函数,每次输出都相同。
现在,我们来看一个随时间或每次调用而变化的函数:
Math.random() // 返回一个随机数
Math.random() // 返回一个不同的随机数
// 一个月后
Math.random() // 返回一个不同的随机数
如你所见,每次调用 Math.random()
时,输出都会改变,因此我们不能说 Math.random()
是纯函数。
第二标准:自包含
通过使用非纯函数,这个标准也很容易理解,所以让我们看看非纯函数是什么样子的:
const numberOfApples = 5
const applesBought = 5
const addApplesToTotal = (num1) => numberOfApples + num1;
const totalApples = addApplesToTotal(applesBought); // 10
从上一个示例可以看到,函数 addApplesToTotal
使用的是上面定义的变量,它不是传递 numberOfApples
的值,而是直接访问外部范围。因此,addApplesToTotal
不是自包含的。
第三个条件:它不应修改程序的状态或引起副作用
与前面的标准一样,可以使用非纯函数很好地演示这个标准。我们来看一下
以上是关于纯函数:函数式编程入门的主要内容,如果未能解决你的问题,请参考以下文章