以下add()
功能是否参考透明?
const appState = {
runningTotal: 0
}
function add(x, y) {
const total = x + y;
appState.runningTotal += total;
return total;
}
由于我发现参考透明度的一些定义,我不确定答案。以下是我对其正确性的信心顺序。
如果符合以下条件,则函数是引用透明的:
鉴于上述每个定义,我认为答案是:
appState
回到具体问题:add()
引用透明吗?
提前致谢!
P.S。 - 如果我混淆了多个概念,请告诉我,即pure function
。
答案 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;无国籍"。