Pac*_*ier 9 java language-agnostic idempotent
来自另一个线程的帖子说如果一个函数可以被多次调用而不改变结果,则该函数被认为是幂等的.
然而,所使用的术语(如无副作用和返回相同结果)相对模糊.考虑一下这段代码:
public class test {
int x = 0;
java.util.Random r = new java.util.Random();
public int F() {
return x + 1;
}
public void F2() {
x = r.nextInt();
}
}
Run Code Online (Sandbox Code Playgroud)
我们可以说这F()是幂等的因为连续调用F()返回相同的值吗?
或者它是不是幂等的,因为F()如果F2()在中间调用后,连续调用不返回相同的值?
PS:计算机科学中定义的" 幂等 ",而不是数学.
Dav*_*rtz 10
我将不同意(实际上,我现在看到我同意他们!)与其他答案并说,在最常见的计算机科学中使用(带副作用的函数调用,而不是函数式编程),函数是幂等,如果您可以安全地替换函数的任何调用,并调用该函数两次并仅保留第二个结果.
例如,考虑两个按名称删除文件的功能:
1)如果文件不存在则返回成功的函数.(因为删除操作的目的是使文件不存在.)
2)如果文件不存在,则返回"文件不存在"错误的函数.(由于无法删除文件.)
第一个是幂等的.如果您调用它并忽略结果,则可以再次调用它并仍然获得正确的信息.完成后,该文件不存在.
第二个不是幂等的.如果您调用一次并忽略结果,则第二次调用将失败,使您认为您没有删除该文件.
获取当前时间的函数在此定义下是幂等的,即使结果可能不同.调用该函数两次没有坏处.
该概念在客户端 - 服务器协议中很重要.假设您发送命令并且没有得到回复,可能连接断开,也许服务器崩溃了.所以你再次发送命令并得到答复.但在第一个命令,命令丢失或回复?如果命令是幂等的,那没关系.你可以使用结果.
如果协议保证所有操作都是幂等的,则较低级别的代码可以重试失败的操作,切换服务器,以及在不破坏操作语义的情况下尝试"使工作正常".
制作幂等协议需要做一些工作.例如,您可能想知道如何进行合理的"删除文件"操作.一种方法是为每个文件分配一个唯一的ID,该ID在删除和重新创建文件时会发生变化.然后将删除分成两半.第一个"从名称获取ID"是幂等的,如果文件不存在则失败.第二个"如果存在则删除ID"是幂等的,如果您或其他任何人删除了该文件,则会成功.(一个怪癖是这并不能告诉你确定你是删除文件的人.)两个幂等操作的组合提供了所需的非幂等删除操作.
你的功能不是幂等的.它可以返回不同的结果.给定相同的输入,幂等函数总是返回相同的输出.
更明确地说,如果f()是幂等的(根据计算机科学定义),那么:
int result1 = f(x);
// ... some arbitrary code
int result2 = f(x);
assert(result1 == result2);
Run Code Online (Sandbox Code Playgroud)