gpt4 book ai didi

deterministic - 幂等函数和确定性函数有什么区别?

转载 作者:行者123 更新时间:2023-12-04 00:30:13 25 4
gpt4 key购买 nike

它们(幂等函数和确定性函数)是否只是在给定相同输入的情况下返回相同结果的函数?

还是我遗漏了什么区别?
(如果有区别,请你帮我理解它是什么)

最佳答案

用更简单的话来说:

  • 纯确定性函数 :输出完全且仅基于输入值,没有其他任何东西:没有其他(隐藏的)输入或状态依赖于生成其输出。没有副作用或其他输出。
  • 不纯的确定性函数 :与作为纯函数的确定性函数一样:输出完全且仅基于输入值,仅基于输入值,没有其他任何东西:没有其他(隐藏的)输入或状态依赖于生成它的输出 - 但是 还有其他输出(副作用)。
  • 幂等性 : 实际定义是你可以安全地多次调用同一个函数而不必担心负面影响。更正式地说:在随后的相同调用之间没有状态变化。

  • 幂等性并不意味着确定性(因为函数可以在第一次调用时改变状态,而在后续调用中是幂等的),但所有纯确定性函数本质上都是幂等的(因为在调用之间没有保持内部状态)。不纯的确定性函数不一定是幂等的。



    纯确定性
    不纯确定性
    纯非确定性
    不纯的非确定性
    幂等的


    输入
    只有参数参数(包括 this )
    只有参数参数(包括 this )
    参数参数和隐藏状态
    参数参数和隐藏状态
    任何

    输出
    只返回值
    返回值或副作用
    只返回值
    返回值或副作用
    任何

    副作用
    没有任何
    是的
    没有任何
    是的
    第一次通话后:Maybe. 第二次通话后:无

    SQL 示例 UCASE CREATE TABLE GETDATE DROP TABLE
    C# 示例 String.IndexOf List<T>.Add DateTime.Now Random.Next Directory.Create [1]


  • [1] - Directory.Create 是幂等的,因为如果目录已经存在,那么它返回一个新的 DirectoryInfo 实例,就好像它只是创建了一个新的文件系统目录(就像 CreateFile 可用于打开现有文件一样)。

  • 纯函数的确定性
    例如,在 SQL UCASE(val) 或 C#/.NET 中 String.IndexOf 都是确定性的,因为输出仅取决于输入。请注意,在实例方法(例如 IndexOf )中,实例对象(即隐藏的 this 参数)计为输入,即使它是“隐藏的”:
    "foo".IndexOf("o") == 1 // first cal
    "foo".IndexOf("o") == 1 // second call
    // the third call will also be == 1
    而在 SQL NOW() 或 C#/.NET 中 DateTime.UtcNow 不是确定性的,因为即使输入保持不变,输出也会发生变化(请注意,.NET 中的属性 getter 等效于除隐式 this 参数外不接受任何参数的方法):
     DateTime.UtcNow == 2016-10-27 18:10:01 // first call
    DateTime.UtcNow == 2016-10-27 18:10:02 // second call
    幂等性
    .NET 中的一个很好的例子是 Dispose() 方法:参见 Should IDisposable.Dispose() implementations be idempotent?

    a Dispose method should be callable multiple times without throwing an exception.


    因此,如果父组件 Xfoo.Dispose() 进行初始调用,那么它将调用处理操作, X 现在可以考虑处理 foo。执行/控制然后传递给另一个组件 Y ,该组件也尝试处理 foo ,在 Y 调用 foo.Dispose() 之后,它也可以期望 foo 被处理(它是),即使 X 已经处理了它。这意味着 Y 不需要检查 foo 是否已经被释放,从而节省了开发人员的时间 - 并且还消除了第二次调用 Dispose 可能引发异常的错误,例如。
    另一个(通用)示例在 REST 中:HTTP1.1 的 RFC 指出 GETHEADPUTDELETE 是幂等的,但 POST 不是( https://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html )

    Methods can also have the property of "idempotence" in that (aside from error or expiration issues) the side-effects of N > 0 identical requests is the same as for a single request. The methods GET, HEAD, PUT and DELETE share this property. Also, the methods OPTIONS and TRACE SHOULD NOT have side effects, and so are inherently idempotent.


    所以如果你使用 DELETE 那么:
    Client->Server: DELETE /foo/bar
    // `foo/bar` is now deleted
    Server->Client: 200 OK
    Client->Server DELETE /foo/bar
    // foo/bar` is already deleted, so there's nothing to do, but inform the client that foo/bar doesn't exist
    Server->Client: 404 Not Found
    // the client asks again:
    Client->Server: DELETE /foo/bar
    // foo/bar` is already deleted, so there's nothing to do, but inform the client that foo/bar doesn't exist
    Server->Client: 404 Not Found
    所以你在上面的例子中看到 DELETE 是幂等的,因为服务器的状态在最后两个 DELETE 请求之间没有改变,但它不是确定性的,因为服务器返回了第一个请求的 200 而第二个请求的 404

    关于deterministic - 幂等函数和确定性函数有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40296211/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com