Genau genommen ist dies keine Curry-Funktion, sondern eine Methode mit mehreren Argumentlisten, obwohl sie zugegebenermaßen wie eine Funktion aussieht.
Wie Sie sagten, ermöglichen die Listen mit mehreren Argumenten, dass die Methode anstelle einer teilweise angewendeten Funktion verwendet wird. (Entschuldigung für die allgemein albernen Beispiele, die ich benutze)
object NonCurr {
def tabulate[A](n: Int, fun: Int => A) = IndexedSeq.tabulate(n)(fun)
}
NonCurr.tabulate[Double](10, _)
val x = IndexedSeq.tabulate[Double](10) _
x(math.exp(_))
Ein weiterer Vorteil ist, dass Sie geschweifte Klammern anstelle von Klammern verwenden können, was gut aussieht, wenn die zweite Argumentliste aus einer einzelnen Funktion oder einem Thunk besteht. Z.B
NonCurr.tabulate(10, { i => val j = util.Random.nextInt(i + 1); i - i % 2 })
gegen
IndexedSeq.tabulate(10) { i =>
val j = util.Random.nextInt(i + 1)
i - i % 2
}
Oder für den Thunk:
IndexedSeq.fill(10) {
println("debug: operating the random number generator")
util.Random.nextInt(99)
}
Ein weiterer Vorteil ist, dass Sie zum Definieren von Standardargumentwerten auf Argumente einer vorherigen Argumentliste verweisen können (obwohl Sie auch sagen könnten, dass es ein Nachteil ist, dass Sie dies nicht in einer einzelnen Liste tun können :)
def doSomething(f: java.io.File)(modDate: Long = f.lastModified) = ???
Schließlich gibt es drei weitere Anwendungen in einer Antwort auf einen verwandten Beitrag. Warum bietet Scala sowohl mehrere Parameterlisten als auch mehrere Parameter pro Liste an? . Ich werde sie hier nur kopieren, aber der Kredit geht an Knut Arne Vedaa, Kevin Wright und extempore.
Erstens: Sie können mehrere var args haben:
def foo(as: Int*)(bs: Int*)(cs: Int*) = as.sum * bs.sum * cs.sum
... was in einer einzigen Argumentliste nicht möglich wäre.
Zweitens hilft es bei der Typinferenz:
def foo[T](a: T, b: T)(op: (T,T) => T) = op(a, b)
foo(1, 2){_ + _}
def foo2[T](a: T, b: T, op: (T,T) => T) = op(a, b)
foo2(1, 2, _ + _)
Und schließlich ist dies die einzige Möglichkeit, implizite und nicht implizite implicit
Argumente zu haben , ebenso wie ein Modifikator für eine ganze Argumentliste:
def gaga [A](x: A)(implicit mf: Manifest[A]) = ???
def gaga2[A](x: A, implicit mf: Manifest[A]) = ???