2011-12-18 2 views
8

Как создать массив функций в Scala, чтобы я мог их перебрать и вызвать для выполнения вычислений?Массив функций?

def f1(x: Int, y: Int): Int = x + y 

def f2(x: Int, y: Int): Int = x - y 

def f3(x: Int, y: Int): Int = x * y 

def test() { 
    val someValues1 = List(1, 2) 
    val someValues2 = List(3, 4) 
    val fnList = Array(f1,f2,f3) 

    for (f <- fnList; a <- someValues1; b <- someValues2) { 
    val result = f(a, b) 
    println("Result=" + result) 
    } 
} 
+1

И что не так с вашей реализацией? – Rogach

ответ

23

В вашем вопросе, вы говорите, что вы хотите, массив функций. Но во всем фрагменте кода нет ни одной функции!

Я предполагаю по именам f1, f2 и f3 что вы считали, что это функции. Но это не так: ключевое слово def используется для объявления методов, а не функции. Эти два: принципиально разные!

Итак, если вы хотите использовать массив функций, просто сделать f1, f2 и f3 фактически быть функций вместо методов:

val f1: (Int, Int) => Int = _ + _ 
val f2: (Int, Int) => Int = _ - _ 
val f3: (Int, Int) => Int = _ * _ 

Альтернатива, что будет на самом деле чтения сообщение об ошибке, которое сообщает вам точно, в чем проблема и как исправить:

error: missing arguments for method f1 in object $iw; 
follow this method with `_' if you want to treat it as a partially applied function 
      val fnList = Array(f1,f2,f3) 
          ^

Так что, если вы просто делать то, что сообщение об ошибке говорит вам делать, а именно преобразовать методы с функциями, используя оператор _, все будет работать нормально:

val fnList = Array(f1 _, f2 _, f3 _) 

причина, почему вы получаете сообщение об ошибке просто потому, что Scala позволяет вам оставить круглые скобки в вызове метода. Итак, f1 просто означает «вызывать f1 без списка аргументов», что является ошибкой, потому что f1 принимает два аргумента.

В некоторых случаях, когда это действительно больно совершенно очевидно, что аргумент не может возможно быть что угодно, но функцию, Scala будет выполнять преобразование из метода функционировать автоматически. Таким образом, третий вариант будет сделать это больно явно очевидно, Scala, что вы сделать есть массив функций, с помощью, вы знаете, объявив его как массив функций:

val fnList: Array[(Int, Int) => Int] = Array(f1, f2, f3) // or 
val fnList = Array[(Int, Int) => Int](f1, f2, f3) 

Теперь, Scala знает, что fnList - это массив функций, он больше не пытается вызвать f1, вместо этого он преобразует его в функцию.

4

Просто укажите параметр типа для массива:

val fnList = Array[(Int,Int)=>Int](f1, f2, f3) 
7

Или написать как:

scala> val fnList = Array(f1 _,f2 _,f3 _) 
fnList: Array[(Int, Int) => Int] = Array(<function2>, <function2>, <function2>) 
4

Пока не ясно, что вы просите, но вы также можете знать, что

val fnList = Array[(Int,Int) => Int](_ + _, _ - _, _ * _) 

работы.

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