2013-08-31 4 views
10

У меня есть этот код:Скала Передача оператора в качестве аргумента функции

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 

и, вероятно, также используйте для этого частично применимую функцию ... но к настоящему времени это можно было бы достичь? Как?

ответ

8

Чтобы избавиться от подчеркивания, вам необходимо определить функции как значения.

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, %)) 
+0

Это именно то, о чем я просил, спасибо :) – LowFieldTheory

+1

круто с точки зрения того, насколько гибким является язык, но довольно неясный из перспективы обслуживания. Я бы не позволил этому войти в кодовую базу. – maasg

6

Edited/Обновление:

Будучи кратким, самый короткий способ сделать это:

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, _ % _)

+2

только одно - это действительно многословие. Я искал какую-то небольшую функцию, чтобы не дублировать много charachters только для одного оператора, и, зная scala, я почти наверняка мог передать функцию только% или /. На самом деле это половина ответа на мой вопрос, я искал метод, который можно передать непосредственно оператору, а не создавать две функции-обертки. – LowFieldTheory

+0

@Novalink, посмотрите мое обновление, пожалуйста. – tkroman

+0

О, я отредактировал ответ, а затем заметил, что @maasg уже разместил решение. Извините за шум. – tkroman

16

Во-первых, необходимо правильно определить op как функции (в частности, Function2)

def operate(a: Int, b: Int, op: (Int, Int) => Int) : Int = (op ((a - b), 3)).abs

Операторы в Scala фактически методы: + является метод Int (и длинные, двойные, ...) в фундаменте Scala OO. Затем, чтобы передать оператор (метод) в качестве функции, вы можете поднять его, используя обозначение подчеркивания: operate(5, 3, _ + _)

Смежные вопросы