2009-09-18 11 views
12

Ich versuche, eine 2-Parameter-Funktion in List.foreach, mit dem ersten Parameter fest für eine Schleife. In der Tat möchte ich eine Funktion von zwei Parametern in Abhängigkeit von einem Parameter zum Curry, der eine Funktion eines Parameters zurückgibt (wie List.foldLeft tun)Wie man eine Funktion in Scala curry

Das funktioniert nicht:

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

Dies funktioniert:

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

Aber ich will nicht die Unterschrift von mathFunc1 ändern, so möchte ich so etwas wie zu tun:

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

Antwort

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

Unterstreichen, die Scala Wildcard!

Als kleinere Neugier, dies wird auch funktionieren:

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

Oder auch:

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

Entschuldigen Sie mich, nur aus Neugier, was ist der Zweck des Parameters v: Double in eval? Jedes Mal, wenn die Ergebnisse 3.1, 4.1, 5.1 – jimakos17

+0

@ jimakos17 sind, wird es nicht verwendet. So war es aber in der Frage, also behielt ich es so. –