2009-09-18 12 views
12

Sto provando a richiamare una funzione di 2 parametri in List.foreach, con il primo parametro corretto per il ciclo. In realtà voglio curry una funzione di due parametri in una funzione di un parametro che restituisce una funzione di un parametro (come fanno List.foldLeft)Come eseguire il curry di una funzione in Scala

Questo non funziona:

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

Questo funziona:

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

Ma io non voglio cambiare la firma di mathFunc1, quindi voglio fare qualcosa di simile:

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

risposta

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

Sottolineato, il carattere jolly Scala!

Come curiosità minore, questo funziona anche:

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

O anche:

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

Mi scusi, solo per curiosità, qual è lo scopo del parametro v: doppia in eval? Ogni volta che i risultati sono 3.1, 4.1, 5.1 – jimakos17

+0

@ jimakos17 Non viene utilizzato. Però era così nella domanda, quindi l'ho tenuto in quel modo. –

Problemi correlati