这是一个引用透明的功能吗?
以下add()
函数是否透明?
const appState = {
runningTotal: 0
}
function add(x, y) {
const total = x + y;
appState.runningTotal += total;
return total;
}
由于我为参照透明度所发现的少数定义,我不确定答案。 以下是我对自己正确性的信心。
如果满足以下条件,则函数具有透明性:
鉴于上面的每个定义,我会认为答案是:
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