【问题标题】:Do javascript functions have referential transparency with mutable state?javascript 函数是否具有可变状态的引用透明度?
【发布时间】:2018-10-22 21:54:13
【问题描述】:

Reading through this article on Javascript Functional Programming 并提到 参考透明度 被定义为:

引用透明性:函数总是为相同的参数提供相同的返回值。这意味着函数不能依赖于任何可变状态。

IIUC Javascript 函数即使依赖于可变状态也满足这个要求,因为两个函数即使同时运行也不能对共享状态进行操作?

【问题讨论】:

  • @Ole javascript 是单线程的,所以很难看出两个函数如何同时对共享数据进行操作。
  • 不,不是 虽然 fn 正在运行,但这并不重要,我认为?只是x 可以重新分配,无论何时可以重新分配
  • 虽然知道“共享可变状态”对于给定环境是否值得担心当然很重要,但这与我引用的问题是分开的,即 - 无论是否@987654324 @ 可以在 fn 运行时更改(即使大多数时候不能,我什至不确定它何时可能),fn 的输出仍然取决于 @ 987654327@,这不是一个参数,因此fn 是不纯的(或者,不是引用透明的?)无论如何。
  • 我认为不同之处在于参数是显式输入,而 x 只是一个外部变量。对于fn调用者 而言,知道fn(5) 将始终返回相同的输入(无论状态如何)很有用。尽管其他编程语言对 共享可变状态 的主要关注点对 JS 来说不是问题,因为它是单线程的,但纯函数仍然可以使代码更易于推理。
  • @MarkMeyer 您可以通过创建一个新的单独窗口并将值存储在 localStorage 中来拥有两个线程。在 localStorage 中读取和写入值的两个窗口之前,我实际上不得不处理竞争条件。

标签: javascript node.js typescript web-worker


【解决方案1】:

总结一下我们的讨论,是的,只要它们所依赖的可变状态不变,Javascript 函数就确实具有引用透明性。

换句话说,相同的输入将提供相同的输出,而函数所依赖的可变状态保持不变。

这似乎有些明显,但对于 Javascript 和函数式编程来说,这是一个重要的概念/实现,因为 Javascript 不能同时在两个线程中运行该函数。如果我们可以在函数运行时更改函数所依赖的状态,我们可以创建难以推理的竞争条件,这将使函数结果不可预测,这是我们试图通过引用透明性来避免的。

例如一个函数fn(5),它依赖于可变状态x,只要x不改变,对于相同的输入总是返回相同的结果。

在非 Javascript 环境中,可以在函数运行时更改 x,因此两次调用 fn(5) 可能会返回不同的结果。

如果使用 Javascript,如果 fn(5) 返回不同的结果,我们确切地知道原因。这是因为xfn(5) 的调用之间发生了变化。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-13
    • 2011-02-08
    • 1970-01-01
    • 2012-05-03
    • 1970-01-01
    • 2021-08-07
    相关资源
    最近更新 更多