这可能是一个非常基本的问题。我是Scala的新手。在Scala中,我有一个函数,其第二个参数的默认参数值为:
def fun(number : Int, defaultNumber : Int = 0): Int = {number + defaultNumber}
我想要一个更高的函数,我可以传递一个lowerOrder函数,例如上面第二个参数有默认值的函数。首次尝试如下:
def higherOrder(lowerOrder : (Int, Int) => Int, number: Int) =
{lowerOrder(number)}
这显然会出错:
错误:方法适用的参数不足:(v1:Int,v2:Int)特征Function2中的Int。 未指定的值参数v2。
解决这个问题的方法是在higherOrder函数中获取默认值:
def higherOrder(lowerOrder : (Int, Int) => Int, number: Int, defaultNumber: Int = 0) =
{lowerOrder(number, defaultNumber)}
但我不想这样做,因为我可能想要传递不同的lowerOrder函数,这些函数对于它们的第二个参数具有不同的默认值,我可能不知道将默认值传递给higherOrder函数的默认值是什么。对此有什么解决方案吗?
答案 0 :(得分:2)
定义低阶函数的特征。
trait Fun {
def apply(number : Int, defaultNumber : Int = 0): Int
}
为低阶函数创建lambda函数。现在您可以使用函数文字符号来定义乐趣(请注意,您需要使用-Xexperimental启动REPL才能使此步骤起作用)
val fun: Fun = { (number : Int, defaultNumber : Int) => number + defaultNumber }
现在,您可以在更高阶函数中使用此lambda函数。
def higherOrder(lowerOrder : Fun, number: Int) =
{lowerOrder(number)}
立即调用高阶函数。
higherOrder(fun, 10)
> result: Int = 10