LowFieldTheory
LowFieldTheory

Reputation: 1773

scala, Passing an operator as argument of a function

I have this code:

for( i <- 0 to 8){
  ((numbers(i) - i)/3).abs + ((numbers(i) - i)%3).abs
}

and I would like to do, as the title says, something like this

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

and probably also use a partially applied function for it.. but by now this would be possible to achieve? How?

Upvotes: 11

Views: 6052

Answers (3)

Karl
Karl

Reputation: 1230

To get rid of the underscores you need to define the functions as values.

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

Upvotes: 12

tkroman
tkroman

Reputation: 4798

Edited/Update:

Being concise, the shortest way to do it is:

def doStuff(a: Int, b: Int, op: (Int, Int) => Int) = {op(a - b, 3).abs}

doStuff(4,1,_%_)

So you can doStuff(numbers(i), i, _ / _) + doStuff(numbers(i), i, _ % _)

Upvotes: 6

maasg
maasg

Reputation: 37435

First, you need to correctly define op as a function (specifically, a Function2)

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

Operators in Scala are actually methods: + is a method of Int(and Long, Double, ...) in Scala OO foundation. Then, to pass a operator (method) as a function, you can lift it using the underscore notation: operate(5, 3, _ + _)

Upvotes: 18

Related Questions