纯函数是幂等的吗?

时间:2015-10-08 08:36:01

标签: javascript angularjs idempotent

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

如果我在官方Angular.js tutorial中没有看到这个陈述,我不会问这么疯狂的问题:

  

过滤函数应该是纯函数,这意味着它   应该是无国籍和幂等的。 Angular依赖于这些属性   并且只有当函数的输入发生变化时才执行过滤器。

这似乎暗示纯函数应该是无状态的和幂等的,这与我认为纯函数的通用定义不匹配。

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

更奇怪的是:如果你看一下维基百科页面中关于该教程中链接的纯函数(我只能发布一个链接,因为我是新用户,抱歉...):它报告 sin < / em>( x )作为纯函数的一个例子。

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

我错过了什么?

1 个答案:

答案 0 :(得分:0)

即可。纯函数总是幂等的。然而,考虑到纯函数的定义,讨论它们的幂等特性并没有多大意义。

纯函数符合两个标准:

  • 确定性,即在给定相同输入的情况下,函数产生相同的输出,
  • 无副作用,即该功能仅改变其内部范围的状态。

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

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

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

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