11

我有这个代码:

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

并且可能还为它使用部分应用的功能..但是现在这可以实现吗?如何?

4

3 回答 3

18

首先,您需要正确定义op为函数(特别是 a Function2

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

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

于 2013-08-31T21:09:41.267 回答
11

要摆脱下划线,您需要将函数定义为值。

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, %))
于 2013-09-01T03:56:24.043 回答
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, _ % _)

于 2013-08-31T20:40:07.660 回答