Использование оператора (или синтетической функции) в качестве параметра

Ниже код работает нормально

  def exec(f: (Int, Int) => Boolean, p1: Int, p2: Int) = f(p1, p2)
  val >= = (x1: Int, x2: Int) => x1 >= x2
  println(exec(>=, 10, 10))

однако вопрос в том, можно ли заставить его работать без явного переопределения оператора (синтетическая функция)?

Обновить

Понятно, что это работает абсолютно нормально, как это

println(exec(_ >= _, 10, 10))

Вопрос в том, можно ли заставить его работать в форме exec(>=, 10, 10) без определения функционального значения.


person Dr Y Wit    schedule 01.06.2020    source источник


Ответы (2)


В дополнение к моему другому ответу вы можете сделать это:

println(exec(10, 10)(_ >= _))
person Luis Miguel Mejía Suárez    schedule 01.06.2020
comment
Как показано в вашем другом ответе, каррирование помогает определить тип параметров в Scala 2 (Scala 3 может сделать это без нескольких списков параметров). Я не думаю, что каррирование здесь имеет какое-то значение. Вопрос больше о том, есть ли способ опустить заполнители (подчеркивания). - person Dr Y Wit; 01.06.2020
comment
@DrYWit да, насколько я знаю, нет способа преобразовать символический метод в функцию без псевдонима или заполнителя. - person Luis Miguel Mejía Suárez; 01.06.2020

Позвольте мне попытаться ответить на мой собственный вопрос.

Методы сравнения объявлены в Int следующим образом

def>=(x: Int): Boolean

Поэтому они вызываются для экземпляра Int и применяются к одному аргументу. Невозможно передать такие методы в качестве параметров, не «привязывая» их двумя аргументами.

Мы можем сделать это, заранее объявив метод или функциональное значение и сопоставив его с методом >= в Int, как показано ниже.

def >= (x1: Int, x2: Int) = x1 >= x2
def >= = (_: Int) >= (_: Int)
val >= = (x1: Int, x2: Int) => x1 >= x2
val >= = (_: Int) >= (_: Int)

или с помощью анонимной функции в форме _ >= _.

person Dr Y Wit    schedule 06.06.2020