2009-09-18 10 views
12

Estoy tratando de llamar a una función de 2 parámetros en List.foreach, con el primer parámetro fijo para un bucle. De hecho quiero ganarse una función de dos parámetros en función de un parámetro que devuelve una función de un parámetro (como hacen List.foldLeft)Cómo curry una función en Scala

Esto no funciona:

private def mathFunc1(a: Double, b: Double) = 
    println(a + b) 


def eval(v: Double) = { 
    List(1.0, 2.0, 3.0).foreach(mathFunc1(2.1)) 
} 

Esto funciona:

private def mathFunc2(a: Double)(b: Double) = 
    println(a + b) 


def eval(v: Double) = { 
    List(1.0, 2.0, 3.0).foreach(mathFunc2(2.1)) 
} 

Pero no quiero cambiar la firma de mathFunc1, por lo que quiero hacer algo como:

private def mathFunc1(a: Double, b: Double) = 
    println(a + b) 


def eval(v: Double) = { 
    List(1.0, 2.0, 3.0).foreach(CONVERT_TWO_PARAMS_TO_ONE_ONE(mathFunc1)(2.1)) 
} 

Respuesta

18
private def mathFunc1(a: Double, b: Double) = 
    println(a + b) 


def eval(v: Double) = { 
    List(1.0, 2.0, 3.0).foreach(mathFunc1(2.1, _)) 
} 

Subrayado, el comodín Scala!

Como curiosidad menores, también funcionará:

def eval(v: Double) = { 
    List(1.0, 2.0, 3.0).foreach(Function.curried(mathFunc1 _)(2.1)) 
} 

O incluso:

val curriedMathFunc1 = Function.curried(mathFunc1 _) 
def eval(v: Double) = { 
    List(1.0, 2.0, 3.0).foreach(curriedMathFunc1(2.1)) 
} 
+0

Disculpe, sólo por curiosidad, ¿cuál es la finalidad del parámetro v: Doble en eval? Cada vez que los resultados son 3.1, 4.1, 5.1 – jimakos17

+0

@ jimakos17 No se usa. Sin embargo, así era la cuestión, así que lo mantuve así. –

Cuestiones relacionadas