0

我能够做到这一点:

  def largestAt(fun: (Int) => Int, inputs: Seq[Int]):Int = {
    inputs.reduceLeft(math.max(_,_))
  }

但是,当我尝试这样做时:

def largestAt(fun: (Int) => Int, inputs: Seq[Int]):Int = {
   inputs.reduceLeft(math.max(fun(_),fun(_)))
}

我收到下面提到的编译错误:

overloaded method value max with alternatives:
[error]   (x: Double,y: Double)Double <and>
[error]   (x: Float,y: Float)Float <and>
[error]   (x: Long,y: Long)Long <and>
[error]   (x: Int,y: Int)Int
[error]  cannot be applied to (Int => Int, Int => Int)
[error]     inputs.reduceLeft(math.max(fun(_),fun(_)))

我只想传递funtomath.max调用的结果。我怎样才能做到这一点。

提前致谢...

4

1 回答 1

3

表达式中的匿名函数占位符参数语法

inputs.reduceLeft(math.max(fun(_),fun(_)))

扩展到类似的东西

inputs.reduceLeft(math.max(a => fun(a), b => fun(b)))

并且max不将一对函数作为输入。相反,您可能会追求类似的东西

inputs.reduceLeft((a, b) => math.max(fun(a), fun(b)))

另一方面,下划线的以下用法有效

inputs.reduceLeft(math.max(_, _))

因为它扩展到

inputs.reduceLeft((a, b) => math.max(a, b))

占位符语法可能应该明智地使用,正确使用它的关键是理解下划线的范围

如果下划线位于由 () 或 {} 分隔的表达式内,则将使用包含下划线的最里面的分隔符;

于 2020-05-14T11:58:30.170 回答