2

每个纯函数都是幂等的吗?

如果我没有在官方Angular.js 教程中看到这个声明,我就不会问这么疯狂的问题:

过滤函数应该是纯函数,也就是说它应该是无状态的和幂等的。Angular 依赖于这些属性,仅在函数的输入发生变化时才执行过滤器。

这似乎暗示了一个纯函数应该既是无状态的又是幂等的,这与我认为的纯函数的常见定义不符。

事实上,它甚至不匹配页面中下面的示例,其中反转字符串中的字符是一个过滤器的示例:显然,反转字符串会更改字符串,如果字符串反转,它会再次更改再一次。

更奇怪的是:如果您查看该教程中链接的纯函数的 Wikipedia 页面(我只能发布一个链接,因为我是新用户,抱歉...):它报告sin ( x ) 作为一个示例纯函数。

所以,根据 Angular.js,正弦是幂等的,对吧?

我错过了什么?

4

1 回答 1

2

废弃原来的答案,答案似乎是否定的。看评论!

只有当纯函数返回f(f(x)) === f(x)时,只有当函数什么都不返回时才会出现这种情况。给出的一个很好的例子是double(x),这很明显double(double(x)) !== double(x)


的。纯函数总是幂等的。然而,考虑到纯函数的定义,讨论它们的幂等性质并没有真正的意义。

纯函数满足两个标准:

  • 确定性,即函数在给定相同输入的情况下产生相同的输出,
  • 没有副作用,即函数只改变其内部作用域的状态。

幂等性是函数将系统状态改变为与第一次调用后相同的状态的质量,无论该函数被调用多少次。

例如,如果银行有一笔 ID 为 x 的交易,该交易由银行的交易处理系统使用 处理function processTransaction(id),那么无论系统处理多少次,它都应该只改变系统的状态以一次又一次地反映交易它(例如,如果它被错误地调用了两次)。

因此,鉴于纯函数不会影响系统的状态(没有副作用),它始终不会影响系统的状态。因此,它是幂等的,因为无论调用多少次,它都会将状态改变为与第一次调用后相同的状态。第一次调用也不会改变系统状态,只是为了澄清。

如果您使用非纯函数处理纯函数的结果,则此质量可能会丢失。

于 2017-10-24T10:47:44.863 回答