Scala, Передача оператора в качестве аргумента функции
У меня есть этот код:
for( i <- 0 to 8){
((numbers(i) - i)/3).abs + ((numbers(i) - i)%3).abs
}
и я хотел бы сделать, как говорится в названии, что-то вроде этого
for( i <- 0 to 8){
by3(numbers(i), i, /) + by3(numbers(i), i, %)
}
def by3(a: Int, b: Int, op: Int => Int) = ((a - b) op 3).abs
и, вероятно, также использовать частично применимую функцию для него.. но к настоящему времени это можно было бы достичь? Как?
Ответы
Ответ 1
Чтобы избавиться от подчеркивания, вам нужно определить функции как значения.
val / = (a:Int, b: Int) => a / b
val % = (a:Int, b: Int) => a % b
def by3(a: Int, b: Int, fn: (Int, Int) => Int): Int = fn(a - b, 3).abs
(0 to 8).foreach(i => by3(numbers(i), i, /) + by3(numbers(i), i, %))
Ответ 2
Во-первых, вам нужно правильно определить op
как функцию (в частности, Function2
)
def operate(a: Int, b: Int, op: (Int, Int) => Int ) : Int = (op ((a - b), 3)).abs
Операторы в Scala на самом деле являются методами: + - метод Int (и Long, Double,...) в базе Scala OO. Затем, чтобы передать оператор (метод) в качестве функции, вы можете поднять его, используя обозначение подчеркивания:
operate(5, 3, _ + _)
Ответ 3
Отредактированный/Update:
Короче говоря, самый короткий способ сделать это:
def doStuff(a: Int, b: Int, op: (Int, Int) => Int) = {op(a - b, 3).abs}
doStuff(4,1,_%_)
Итак, вы можете doStuff(numbers(i), i, _ / _) + doStuff(numbers(i), i, _ % _)