Scala

2009-09-18 16 views
12

'daki bir işlevi nasıl körelttim Bir döngü için ilk parametre sabit ile List.foreach öğesinde 2 parametresi işlevini çağırmaya çalışıyorum. Bu işleriScala

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

: Aslında ben (List.foldLeft yapmak gibi)

Bu işe yaramazsa bir parametrenin bir işlevi döndüren bir parametrenin bir fonksiyonu haline iki parametrenin bir fonksiyonu köri istiyorum:

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

Ama mathFunc1 imzasını değiştirmek istemiyoruz, bu yüzden böyle bir şey yapmak istiyorum:

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

cevap

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

Altında, Scala joker karakteri! küçük merakı olarak

, bu da çalışır: hatta

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

Veya:

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

sadece meraktan, Afedersiniz parametre v amacı budur: Çift eval? Sonuçlar her zaman 3.1, 4.1, 5.1 – jimakos17

+0

@ jimakos17 Kullanılmamaktadır. Yine de, bu konuyla ilgili yol buydu, ben de öyle tuttum. –