Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 按值调用和按名称调用等价_Scala_Functional Programming_Lambda Calculus_Callbyname_Call By Value - Fatal编程技术网

Scala 按值调用和按名称调用等价

Scala 按值调用和按名称调用等价,scala,functional-programming,lambda-calculus,callbyname,call-by-value,Scala,Functional Programming,Lambda Calculus,Callbyname,Call By Value,我在上函数式编程的课程,他们讨论了按值调用和按名称调用评估技术之间的区别。他们说,有些观点让我感到困惑: 只要满足以下条件,这两种技术都会降低到相同的最终值: 简化表达式由纯函数和 两个评估都将终止 这似乎是一个lambda微积分定理 你能解释一下纯函数的简化表达式是什么意思吗?纯函数是一种没有副作用的函数,例如执行IO或更改任何非函数局部的值。纯函数的一个例子是: def inc(x: Int) = x+1 var sum = 1 def addToSum(x: Int) = { s

我在上函数式编程的课程,他们讨论了按值调用和按名称调用评估技术之间的区别。他们说,有些观点让我感到困惑:

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

简化表达式由纯函数和 两个评估都将终止 这似乎是一个lambda微积分定理


你能解释一下纯函数的简化表达式是什么意思吗?

纯函数是一种没有副作用的函数,例如执行IO或更改任何非函数局部的值。纯函数的一个例子是:

def inc(x: Int) = x+1
var sum = 1
def addToSum(x: Int) = {
    sum += x
    sum
}
不纯函数的一个例子是:

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
现在,如果我们对纯函数使用这两个函数,结果是相同的:

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版本调用函数一次并保存结果并将其添加到自身

对于纯函数来说,这绝对没有什么区别——给定相同的参数,它将始终返回相同的结果,因此无论您调用它一次并使用保存的结果两次,还是调用它两次(性能除外),都没有区别


对于不纯函数,每次调用该函数时,求和变量的值都会发生变化,这会产生很大的差异。

您看过吗?该课程中有很多其他学习材料的参考资料。最好先检查它们,或者使用课程论坛。@Rodrigo这是一个非正式的声明,lambda演算通过它汇合。您提到的短语可能只是在这里,因为使用Scala定理是对术语的轻微滥用,因为它只适用于语言的某个纯子集。