这是一个参考透明的功能吗?

时间:2018-03-17 22:57:29

标签: functional-programming

以下add()功能是否参考透明?

const appState = {
    runningTotal: 0
}

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

由于我发现参考透明度的一些定义,我不确定答案。以下是我对其正确性的信心顺序。

如果符合以下条件,则函数是引用透明的:

  1. 它可以被其值替换,程序的行为保持不变
  2. 给定一些输入它将始终产生相同的输出
  3. 仅取决于其输入
  4. 无国籍
  5. 鉴于上述每个定义,我认为答案是:

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

      提前致谢!

      P.S。 - 如果我混淆了多个概念,请告诉我,即pure function

      的概念

3 个答案:

答案 0 :(得分:2)

不,它不是一个引用透明的功能。

参照透明度特指您列出的第一个标准,即您可以在不改变程序行为的情况下自由替换表达式左侧和右侧的值。

add(2,3)返回值5,但您无法在程序中将add(2,3)的实例替换为5,因为add(2, 3)也具有副作用runningTotal递增5。将add(2, 3)替换为5会导致runningTotal没有增加,从而改变程序的行为。

答案 1 :(得分:2)

我和

一起去
  

可能 - 这取决于appState.runningTotal的使用方式

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

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

答案 2 :(得分:0)

纯函数是引用透明的。我把它叫做#34; copypastability",也就是说你可以复制粘贴参考透明代码的每一部分,它仍然可以按照最初的预期工作。

必须满足所有这四个标准,尽管您可以将它们缩小到第一个语句。其他都可以从那个推断出来。

如果可以合理地替换某个功能,这意味着您可以将其替换为输入为键并输出为值的地图/词典。所以它总是在同一个输入上返回相同的东西。相同的类比与#34完全一致;仅取决于输入"和#34;无国籍"。