Как передать результат функции в math.max

Я умею это делать:

  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(_)))

Я просто хочу передать результат fun к math.maxвызов. Как я могу этого добиться.

Заранее спасибо...

1 ответ

Решение

Синтаксис параметра заполнителя анонимной функции в выражении

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))

Синтаксис заполнителя, вероятно, следует использовать разумно, и ключ к его правильному использованию - понимание области подчеркивания:

Если подчеркивание находится внутри выражения, разделенного () или {}, будет использоваться самый внутренний такой разделитель, который содержит подчеркивание;

Другие вопросы по тегам