这是一个引用透明的功能吗?

以下add()函数是否透明?

const appState = {
    runningTotal: 0
}

function add(x, y) {
    const total = x + y;
    appState.runningTotal += total;
    return total;
}

由于我为参照透明度所发现的少数定义,我不确定答案。 以下是我对自己正确性的信心。

如果满足以下条件,则函数具有透明性:

  • 它可以被它的价值取代,程序的行为保持不变
  • 给定一些输入将始终产生相同的输出
  • 它只取决于它的输入
  • 它是无状态的
  • 鉴于上面的每个定义,我会认为答案是:

  • 也许 - 我认为这取决于如何在程序中的其他地方使用appState.runningTotal,但我不确定。
  • 我不确定 - 它只依赖于它的输入来产生输出,但它也使用函数体中的appState
  • 没有
  • 回到具体的问题: add()透明?

    提前致谢!

    PS--请让我知道我是否混淆了多个概念,即pure function的概念。


    不,它不是透明的透明功能。

    引用透明性专指您列出的第一个标准,即您可以自由地替换表达式左侧和右侧的值而不更改程序的行为。

    add(2,3)返回值5但不能用程序中的5替换add(2,3)实例,因为add(2, 3)也具有将runningTotal递增5 runningTotal 。 将add(2, 3)替换为5会导致runningTotal不递增,从而改变程序的行为。


    我会一起去的

    也许 - 这取决于如何使用appState.runningTotal

    因为当它不被使用时,那么它可以被忽略。 显然它是全局状态,但它仅仅用于调试还是它是实际应用程序状态的一部分? 如果是后者,那么该函数当然不是纯粹的 - 它会改变状态并用结果值替换一个调用(或者执行不必要的调用,结果会被删除)会改变程序的行为。

    但是如果你确实认为appState.runningTotal不是你的程序的语义的一部分,并且其功能的非功能依赖于它,那么你可能会忽略这种副作用。 我们一直这样做,每一个真实世界的计算都会影响它运行的计算机的状态,当我们考虑函数的纯度时,我们会选择忽略这一点。


    纯粹的功能是透明的。 我把它称为“复制包装”,也就是说你可以复制粘贴每一部分透明的代码,并且它仍然可以按照最初的预期工作。

    所有这四项标准都必须得到满足,尽管你可以将它们缩小到第一个声明。 其他人都可以从那个推断出来。

    如果一个函数可以被合理地替换,那就意味着你可以用一个映射/字典替换它,这个映射/字典的输入是键值,输出值是值。 所以它会在相同的输入上返回相同的结果。 同样的比喻对于“只依赖于输入”和“无状态”很好。

    链接地址: http://www.djcxy.com/p/80585.html

    上一篇: Is this a referentially transparent function?

    下一篇: Is Date.now referential transparent?