2011-12-18 5 views
8

¿Cómo puedo crear una matriz de funciones en Scala para poder recorrerlas y llamarlas para realizar cálculos?¿Matriz de funciones?

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

¿Y qué hay de malo con su implementación? – Rogach

Respuesta

23

En su pregunta, usted dice que desea una gran variedad de funciones. ¡Pero no hay una sola función en el fragmento de código completo!

Supongo que por los nombres f1, f2 y f3 que pensabas que eran funciones. Pero no lo son: la palabra clave def se usa para declarar métodos, no funciones. Esos dos son fundamentalmente diferentes!

lo tanto, si desea utilizar una gran variedad de funciones, basta con f1, f2 y f3 realidad ser funciones en lugar de métodos:

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

Una alternativa a la que sería en realidad leer el mensaje de error, que le dice exactamente cuál es el problema y cómo solucionarlo:

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) 
          ^

lo tanto, si sólo tiene que hacer lo que el mensaje de error que dice que hacer, es decir, convertir los métodos a funciones usando el operador _, todo va a funcionar bien:

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

La razón por la que está recibiendo el mensaje de error es simplemente porque Scala te permite dejar el paréntesis en una llamada a método. Por lo tanto, f1 solo significa "llame al f1 sin una lista de argumentos", que es un error, porque f1 toma dos argumentos.

En algunos casos, cuando es realmente dolorosamente claramente evidente que el argumento no puede posiblemente ser cualquier cosa, pero una función, Scala llevará a cabo la conversión de método a funcionar de forma automática. Por lo tanto, una tercera opción sería la de hacer dolorosamente claramente evidente a Scala que hacer tienen una gran variedad de funciones, por, ya sabes, declarándolo como una serie de funciones:

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

Ahora que Scala sabe que fnList es una matriz de funciones, ya no intenta llamar al f1, sino que lo convierte en una función.

4

acaba de proporcionar el parámetro Type para su arsenal:

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

O escribir como:

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

No está claro lo que estás pidiendo, pero también puede que quiera saber que

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

obras.

Cuestiones relacionadas