Scala 按值调用和按名称调用等价
我在上函数式编程的课程,他们讨论了按值调用和按名称调用评估技术之间的区别。他们说,有些观点让我感到困惑: 只要满足以下条件,这两种技术都会降低到相同的最终值: 简化表达式由纯函数和 两个评估都将终止 这似乎是一个lambda微积分定理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
你能解释一下纯函数的简化表达式是什么意思吗?纯函数是一种没有副作用的函数,例如执行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定理是对术语的轻微滥用,因为它只适用于语言的某个纯子集。