我阅读了维基百科有关幂等性的解释。 我知道这意味着一个函数的输出由其输入决定。 但我记得我听说过一个非常相似的概念:纯函数。 我用谷歌搜索它们,但找不到它们之间的区别......
它们是等价的吗?
我阅读了维基百科有关幂等性的解释。 我知道这意味着一个函数的输出由其输入决定。 但我记得我听说过一个非常相似的概念:纯函数。 我用谷歌搜索它们,但找不到它们之间的区别......
它们是等价的吗?
幂等函数可能会引起幂等性副作用。
纯函数不会。
例如,设置文本框文本的函数是幂等的(因为多次调用会显示相同的文本),但不是纯函数。
同样,通过GUID删除记录(而不是通过计数)是幂等的,因为在后续调用中行保持删除状态。(额外的调用没有任何影响)
一个纯函数是一种没有副作用的函数,其输出仅由输入决定 - 也就是说,调用f(x)
无论调用多少次都会给出相同结果。
幂等函数是指可以重复应用而不改变结果的函数 - 也就是说,f(f(x))
与f(x)
相同。
一个函数可以是纯函数、幂等函数、二者皆是或两者都不是。
f(x) = x+1
不是幂等的,因为 f(f(1)) != f(1)
。 - porges不,幂等函数会改变程序/对象/机器的状态 - 并且尽管重复调用,它只会进行一次更改。纯函数不改变任何东西,并且每次调用时都会提供(返回)结果。
功能纯度意味着没有副作用。另一方面,幂等性意味着一个函数对于多次调用是不变的。
每个纯函数都是副作用幂等的,因为纯函数即使被多次调用也永远不会产生副作用。然而,返回值的幂等性意味着f(f(x)) = f(x),这与纯度无关。
def f(x):
return random()
f(0) = 0.2171
f(0) = 0.3142 # Thus, impure.
def f(x):
return x + 1
f(0) = 1
f(0) = 1 # Thus, pure.
f(1) = 2 # Thus, not idempotent since f(0) != f(f(0)).
def f(x):
return round(x)
f(0.3142) = 0
f(0.3142) = 0 # Thus, pure.
f(0) = 0 # Thus, idempotent.
我发现更多地方将“幂等”定义为f(f(x)) = f(x)
,但我真的不相信这是准确的。相反,我认为这个定义更准确(但不完全):
描述一种行为,当在同一主题上执行多次时,在第一次执行后对其主题没有进一步影响。投影算子是幂等的。
我的理解是,如果我们像下面这样两次应用f
于x
(主题):
f(x);f(x);
那么(副作用)效果与
f(x);
相同。因为纯函数不允许副作用,所以纯函数也是“幂等”的。
更一般(也更准确)的幂等
定义还包括像
toggle(x)
我们可以说,toggle
的幂等度
为2,因为在应用toggle
每2次后,我们总是得到相同的状态
f(x) = f(f(x))
绝对是对幂等性的严谨而准确的定义。在你提到的例子中,"f(x); f(x);
与 f(x)
具有相同的副作用" 被展示为 "幂等性",但幂等函数并不是 f
... 它是一个隐藏的名为 call_f_x
的函数 作用于真实世界的状态。然后,call_f_x(call_f_x(state)) = call_f_x(state)
。这确实是幂等函数的确切定义。 - undefinedcall_f_x
是纯粹的。 - undefined