如何在高阶函数中传递函数的不同参数。下面是我的代码。
val sum = (a: Int, b:Int) => a + b
val x = 7
val y = 9
def sq (x: Int, y: Int, f: (Int, Int)=> Int): Int = {
x + y * f(a,b)
}
println(sq(x,y,sum(2,3)))这不起作用,并抛出一个错误,'a' is not defined。
发布于 2021-08-03 17:17:38
sq的参数列表看起来没问题。对sq的调用不正确,函数将在传入之前进行计算。假设它通过了编译器,当然它不是。
传入一个函数并不意味着它的参数会随之而来。传入函数意味着调用者可能不知道要使用什么参数,甚至不知道是否应该调用该函数。sq函数在调用它时必须提供参数。A和b的含义超出了sum的定义。sq可以提供x和y作为sum的参数。
发布于 2021-08-04 11:21:42
作为对@Nathan answer的补充。下面的例子很有意义:
val sum = (a: Int, b:Int) => a + b
def sq (x: Int, y: Int, f: (Int, Int)=> Int): Int = {
x + y * f(x, y)
}
val x = 7
val y = 9
println(sq(x,y,sum))这将在您的sg函数中进行计算,如:7 + 9 * sum(7, 8)
我希望这是有意义的。
发布于 2021-08-04 12:17:59
除了@Nathan Hughes回答之外,如果您想在每次调用时向sum函数传递不同的参数,则需要更改您的sq方法,如下所示
def sq (x: Int, y: Int, f: (Int, Int)=> Int): (Int, Int)=> Int = {
x + y * f(_: Int, _:Int)
}如果期望来自sq方法的int返回来自‘`sq’的(Int, Int) => Int类型的部分应用函数,则将其他参数传递给该函数,例如,
sq(10, 20, sum)(1, 2) // 1st approach
//2nd approach would be
//You can hold the function in another variable and call that function with other arguments
val partialSum = sq(10,20, sum)
partialSum(1, 2)你会得到你想要的结果。
或者,如果您仍然希望sq方法返回Int,则可以像这样定义sq方法
def sq (x: Int, y: Int, f: (Int, Int)=> Int)(a:Int, b:Int):Int = {
x + y * f(a, b)
}
scala> sq(10,20, sum)(1,2)
res2: Int = 70https://stackoverflow.com/questions/68640114
复制相似问题