给予:
def higherOrderCallByName(f: => Int => Int, x: Int): Int = f(x)
def higherOrderCallByValue(f: Int => Int, x: Int): Int = f(x)
在什么情况下,用名字调用函数参数(即higherOrderCallByName
中的f
)是惯用的/恰当的。
发布于 2016-07-06 21:31:27
为了澄清,在call-by-value,中,参数的值是在传递给函数之前确定的,而在中,对参数的按名调用值被推迟到函数内部使用。
我同意m的观点,在传递函数可能是昂贵调用的情况下,higherOrderCallByName
是完全有效的。
另一个我能想到的场景是,如果传递的函数有一些副作用,那么按名参数的行为将与按值参数不同。我已经修改了您的示例,以说明这一点:
def higherOrderCallByName(f: => Int => Int, x: Int): Int = {
println("Inside by-name function.")
f(x)
}
def higherOrderCallByValue(f: Int => Int, x: Int): Int = {
println("Inside by-value function.")
f(x)
}
def funWithSideEffect() : (Int) => Int = {
println("Some side effect.") // some side-effect or some expensive call
x => x + 1 // returns function which increments param
}
现在,如果调用higherOrderCallByValue(funWithSideEffect(), 2)
输出,则如下所示:
Some side effect.
Inside by-value function.
正如输出所示,副作用发生在higherOrderCallByValue
的身体执行之前。
而higherOrderCallByName(funWithSideEffect(), 2)
的输出将类似于:
Inside by-name function.
Some side effect.
当遇到higherOrderCallByName
时,副作用发生在f(x)
内部。现在,想象一下f(x)
在higherOrderCallByName
中多次执行的场景。显然,它会对您的应用程序产生很大的影响。
https://stackoverflow.com/questions/38236850
复制相似问题