每个纯函数都是幂等的吗?
如果我没有在官方Angular.js教程中看到这句话,我不会问这样一个疯狂的问题:
filter函数应该是一个纯函数,这意味着它应该是无状态的和幂等的。Angular依赖于这些属性,只有当函数的输入改变时才执行filter。
这似乎意味着纯函数应该是无状态的和幂等的,这与我认为的纯函数的常见定义不匹配。
事实上,它甚至不匹配页面中下面的示例,其中反转字符串中的字符是一个过滤器的示例:显然,反转字符串会改变字符串,如果字符串再次反转,它会再次改变。
更奇怪的是:如果你看一下Wikipedia页面上的纯函数链接(我只能发布一个链接,因为我是一个新用户,对不起.):它报告 sin(x)作为纯函数的一个例子。
所以,根据Angular.js,正弦是一个恒等式,对吗?
我错过了什么?
2条答案
按热度按时间ni65a41a1#
废了原来的答案,答案似乎是否。看评论!
仅当纯函数返回
f(f(x)) === f(x)
时,这是仅当函数不返回任何内容时的情况。是的。纯函数总是幂等的。然而,给定纯函数的定义,讨论它们的幂等性质实际上没有意义。
纯函数满足两个标准:
幂等性是函数将系统状态改变为与第一次调用后相同的状态的质量,而不管该函数被调用了多少次。
例如,如果一家银行有一个ID为x的交易,该交易由银行的交易处理系统使用
function processTransaction(id)
进行处理,那么它应该只改变系统的状态以反映该交易一次,并且只改变一次,而不管系统处理了多少次(比如说,如果错误地调用了两次)。因此,如果一个纯函数不影响系统的状态(没有副作用),那么它将永远不会影响系统的状态。因此,它是幂等的,因为无论它被调用多少次,它都会将状态改变为第一次调用后的状态。第一次调用也不会改变系统状态,只是为了澄清。
如果你用一个不纯的函数处理纯函数的结果,这个特性可能会丢失。
hfyxw5xn2#
我不认为f(f(x))= f(x)是恒等式的定义,这个定义在功能上没有用,因为(如前所述)函数永远不会返回任何东西,或者总是相同的返回值。我认为恒等式是无论你应用多少次相同的输入,你总是得到相同的输出。所以:
字符串
示例如下:
型