将具有默认参数的函数传递给更高阶函数

时间:2018-02-23 03:02:38

标签: scala

这可能是一个非常基本的问题。我是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函数的默认值是什么。对此有什么解决方案吗?

1 个答案:

答案 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