[英]Call-by-value and by-name equivalence
我正在Coursera函数编程课程中工作,有时他们会讨论按值调用和按名称调用评估技术之间的区别。 他们说这是令我困惑的一点:
只要满足以下两种条件,这两种技术都会减少到相同的最终值:
- 约简表达式由纯函数和
- 两次评估均终止
这似乎是λ演算定理。
您能否解释一下“简化表达式由纯函数组成”是什么意思?
纯函数是没有副作用的函数(例如执行IO或更改函数本地以外的任何值)。 一个纯函数的示例是:
def inc(x: Int) = x+1
不纯函数的一个示例是:
var sum = 1
def addToSum(x: Int) = {
sum += x
sum
}
因此,现在让我们考虑以下两种方法,它们的区别仅在于它们是使用名称还是使用值作为参数:
def doubleByValue(x: Int) = x + x
def doubleByName(x: =>Int) = x + x
现在,如果我们将这两个函数与pure函数一起使用,则结果是相同的:
doubleByValue(inc(2)) // => 6
doubleByName(inc(2)) // => 6
但是,如果将它们应用于不纯函数,结果将有所不同:
sum = 1 // Let's reset sum, so the result isn't affected by previous uses
doubleByValue(addToSum(2)) // => 6, the value of `sum` is now 3
sum = 1 // Let's reset sum, so the result isn't affected by previous uses
doubleByName(addToSum(2)) // => 8, the value of `sum` is now 5
区别在于ByName
版本调用该函数两次并添加两个结果,而ByValue
版本调用一次,保存结果并将其添加到自身。
对于纯函数,这绝对没有区别-给定相同的参数,它将始终返回相同的结果,因此,无论是调用一次还是使用保存的结果两次还是调用两次(性能除外)都没有区别。
对于不纯函数,每次调用函数时sum
更改sum
变量的值,因此差异很大。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.