scala,将运算符作为函数的参数传递

时间:2013-08-31 20:19:17

标签: 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

并且可能还使用部分应用的功能..但到现在这可能实现?怎么样?

3 个答案:

答案 0 :(得分:17)

首先,您需要将op正确定义为函数(具体而言,Function2

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

Scala中的运算符实际上是方法:+是Scala OO基础中的Int(和Long,Double,...)方法。然后,要将操作符(方法)作为函数传递,可以使用下划线表示法提升它: operate(5, 3, _ + _)

答案 1 :(得分:10)

要删除下划线,您需要将函数定义为值。

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 :(得分:6)

编辑/更新:

简明扼要,最简单的方法是:

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