【问题标题】:Passing a function with default parameter to a higher order function将具有默认参数的函数传递给高阶函数
【发布时间】:2018-02-23 03:02:38
【问题描述】:

这可能是一个非常基本的问题。我是 Scala 的新手。在 Scala 中,我有一个函数,其第二个参数具有默认参数值:

def fun(number : Int, defaultNumber : Int = 0): Int = {number + defaultNumber}

我想要一个 highOrder 函数,我可以向它传递一个 lowerOrder 函数,例如上面的函数,它的第二个参数具有默认值。第一次尝试如下:

def higherOrder(lowerOrder : (Int, Int) => Int, number: Int) =
        {lowerOrder(number)}

这显然会报错:

错误:方法应用的参数不足:(v1: Int, v2: Int)Int in trait Function2。 未指定值参数 v2.

解决这个问题的一种方法是在 highOrder 函数中获取默认值:

def higherOrder(lowerOrder : (Int, Int) => Int, number: Int, defaultNumber: Int = 0) =
        {lowerOrder(number, defaultNumber)}

但我不想这样做,因为我可能想要传递不同的 lowerOrder 函数,它们的第二个参数具有不同的默认值,并且我可能不知道将默认值传递给 higherOrder 函数的默认值是什么。有什么解决办法吗?

【问题讨论】:

    标签: scala


    【解决方案1】:

    为你的低阶函数定义特征。

    trait Fun {
        def apply(number : Int, defaultNumber : Int = 0): Int
    }
    

    为您的低阶函数创建 lambda 函数。现在您可以使用函数文字符号来定义 Fun(请注意,您需要使用 -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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-23
      • 1970-01-01
      • 2022-11-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多