繁体   English   中英

按值和按名称的对等

[英]Call-by-value and by-name equivalence

我正在Coursera函数编程课程中工作,有时他们会讨论按值调用和按名称调用评估技术之间的区别。 他们说这是令我困惑的一点:

只要满足以下两种条件,这两种技术都会减少到相同的最终值:

  1. 约简表达式由纯函数和
  2. 两次评估均终止

这似乎是λ演算定理。

您能否解释一下“简化表达式由纯函数组成”是什么意思?

纯函数是没有副作用的函数(例如执行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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM