angularjs 纯函数是幂等的吗?

vm0i2vca  于 12个月前  发布在  Angular
关注(0)|答案(2)|浏览(135)

每个纯函数都是幂等的吗?
如果我没有在官方Angular.js教程中看到这句话,我不会问这样一个疯狂的问题:
filter函数应该是一个纯函数,这意味着它应该是无状态的和幂等的。Angular依赖于这些属性,只有当函数的输入改变时才执行filter。
这似乎意味着纯函数应该是无状态的和幂等的,这与我认为的纯函数的常见定义不匹配。
事实上,它甚至不匹配页面中下面的示例,其中反转字符串中的字符是一个过滤器的示例:显然,反转字符串会改变字符串,如果字符串再次反转,它会再次改变。
更奇怪的是:如果你看一下Wikipedia页面上的纯函数链接(我只能发布一个链接,因为我是一个新用户,对不起.):它报告 sinx)作为纯函数的一个例子。
所以,根据Angular.js,正弦是一个恒等式,对吗?
我错过了什么?

ni65a41a

ni65a41a1#

废了原来的答案,答案似乎是。看评论!
仅当纯函数返回f(f(x)) === f(x)时,这是仅当函数不返回任何内容时的情况。

是的。纯函数总是幂等的。然而,给定纯函数的定义,讨论它们的幂等性质实际上没有意义。

纯函数满足两个标准:

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

幂等性是函数将系统状态改变为与第一次调用后相同的状态的质量,而不管该函数被调用了多少次。
例如,如果一家银行有一个ID为x的交易,该交易由银行的交易处理系统使用function processTransaction(id)进行处理,那么它应该只改变系统的状态以反映该交易一次,并且只改变一次,而不管系统处理了多少次(比如说,如果错误地调用了两次)。
因此,如果一个纯函数不影响系统的状态(没有副作用),那么它将永远不会影响系统的状态。因此,它是幂等的,因为无论它被调用多少次,它都会将状态改变为第一次调用后的状态。第一次调用也不会改变系统状态,只是为了澄清。
如果你用一个不纯的函数处理纯函数的结果,这个特性可能会丢失。

hfyxw5xn

hfyxw5xn2#

我不认为f(f(x))= f(x)是恒等式的定义,这个定义在功能上没有用,因为(如前所述)函数永远不会返回任何东西,或者总是相同的返回值。我认为恒等式是无论你应用多少次相同的输入,你总是得到相同的输出。所以:

f(x) = y, no matter how many times you call f(x) for any x.

字符串
示例如下:

f(x) = { return x+1 } => idempotent
f(x) = { return counter++ } (where "counter" is some retained state variable) => not idempotent.

相关问题