다중 매개 변수 목록 방법
유형 추론
여러 매개 변수 섹션이있는 메서드는 첫 번째 섹션의 매개 변수를 사용하여 후속 섹션의 인수에 대해 예상되는 형식을 제공 할 형식 인수를 추론함으로써 로컬 형식 유추를 지원하는 데 사용할 수 있습니다. foldLeft
표준 라이브러리에 이것의 표준적인 예가 있습니다.
def foldLeft[B](z: B)(op: (B, A) => B): B
List("").foldLeft(0)(_ + _.length)
이것이 다음과 같이 쓰여졌다면 :
def foldLeft[B](z: B, op: (B, A) => B): B
보다 명시적인 유형을 제공해야합니다.
List("").foldLeft(0, (b: Int, a: String) => a + b.length)
List("").foldLeft[Int](0, _ + _.length)
유창한 API
다중 매개 변수 섹션 메소드의 또 다른 용도는 언어 구조처럼 보이는 API를 만드는 것입니다. 호출자는 괄호 대신 중괄호를 사용할 수 있습니다.
def loop[A](n: Int)(body: => A): Unit = (0 until n) foreach (n => body)
loop(2) {
println("hello!")
}
M 매개 변수 섹션이있는 메서드에 N 인수 목록 적용 (여기서 N <M)은를 사용하여 명시 적으로 _
또는 FunctionN[..]
. 이것은 안전 기능입니다. 배경은 Scala References의 Scala 2.0에 대한 변경 노트를 참조하십시오.
카레 기능
커리 함수 (또는 간단히 함수를 반환하는 함수)는 N 인수 목록에 더 쉽게 적용 할 수 있습니다.
val f = (a: Int) => (b: Int) => (c: Int) => a + b + c
val g = f(1)(2)
이 사소한 편의는 때때로 가치가 있습니다. 함수는 유형 매개 변수가 될 수 없으므로 경우에 따라 메서드가 필요합니다.
두 번째 예는 함수를 반환하는 하나의 매개 변수 섹션 메서드 인 하이브리드입니다.
다단계 계산
카레 기능이 유용한 다른 곳은 어디입니까? 다음은 항상 나타나는 패턴입니다.
def v(t: Double, k: Double): Double = {
val ft = f(t)
g(ft, k)
}
v(1, 1); v(1, 2);
결과를 f(t)
어떻게 공유 할 수 있습니까? 일반적인 해결책은 다음의 벡터화 된 버전을 제공하는 것입니다 v
.
def v(t: Double, ks: Seq[Double]: Seq[Double] = {
val ft = f(t)
ks map {k => g(ft, k)}
}
추한! 우리는 관련이없는 문제를 얽히게 한 - 계산 g(f(t), k)
의 순서를 통해 매핑 ks
.
val v = { (t: Double) =>
val ft = f(t)
(k: Double) => g(ft, k)
}
val t = 1
val ks = Seq(1, 2)
val vs = ks map (v(t))
함수를 반환하는 메서드를 사용할 수도 있습니다. 이 경우 좀 더 읽기 쉽습니다.
def v(t:Double): Double => Double = {
val ft = f(t)
(k: Double) => g(ft, k)
}
그러나 여러 매개 변수 섹션이있는 메소드로 동일한 작업을 시도하면 멈춰 있습니다.
def v(t: Double)(k: Double): Double = {
^
`-- Can't insert computation here!
}