12

List.foreachで2つのパラメーター関数を呼び出そうとしていますが、最初のパラメーターはループ用に修正されています。実際、2つのパラメーターの関数を1つのパラメーターの関数にカレーして、1つのパラメーターの関数を返します(List.foldLeftのように)

これは動作しません:

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

これは機能します:

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

しかし、mathFunc1の署名を変更したくないので、次のようなことをしたいと思います。

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

1 に答える 1

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

アンダースコア、Scalaワイルドカード!

ちょっとした好奇心として、これも機能します。

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

あるいは:

val curriedMathFunc1 = Function.curried(mathFunc1 _)
def eval(v: Double) = {
    List(1.0, 2.0, 3.0).foreach(curriedMathFunc1(2.1))
}
于 2009-09-19T00:53:37.960 に答える