엄밀히 말하면 이것은 카레 함수가 아니라 여러 인수 목록이있는 메서드입니다. 물론 함수처럼 보입니다.
말했듯이 다중 인수 목록을 사용하면 부분적으로 적용된 함수 대신 메서드를 사용할 수 있습니다. (내가 사용하는 일반적으로 어리석은 예에 대해 죄송합니다)
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(_))
또 다른 이점은 두 번째 인수 목록이 단일 함수 또는 썽 크로 구성되어있는 경우 멋지게 보이는 괄호 대신 중괄호를 사용할 수 있다는 것입니다. 예
NonCurr.tabulate(10, { i => val j = util.Random.nextInt(i + 1); i - i % 2 })
대
IndexedSeq.tabulate(10) { i =>
val j = util.Random.nextInt(i + 1)
i - i % 2
}
또는 썽크를 위해 :
IndexedSeq.fill(10) {
println("debug: operating the random number generator")
util.Random.nextInt(99)
}
또 다른 장점은 기본 인수 값을 정의하기 위해 이전 인수 목록의 인수를 참조 할 수 있다는 것입니다 (단일 목록에서이를 수행 할 수 없다는 단점이 있다고 말할 수도 있지만 :).
def doSomething(f: java.io.File)(modDate: Long = f.lastModified) = ???
마지막으로 관련 게시물에 대한 답변에는 세 가지 다른 응용 프로그램이 있습니다. 왜 스칼라가 여러 매개 변수 목록과 목록 당 여러 매개 변수를 모두 제공합니까? . 여기에 복사 할 것이지만 크레딧은 Knut Arne Vedaa, Kevin Wright 및 extempore에게 있습니다.
첫째 : 여러 개의 변수 인수를 가질 수 있습니다.
def foo(as: Int*)(bs: Int*)(cs: Int*) = as.sum * bs.sum * cs.sum
... 단일 인수 목록에서는 불가능합니다.
둘째, 유형 추론을 지원합니다.
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, _ + _)
마지막 implicit
으로 전체 인수 목록에 대한 수정 자 와 마찬가지로 암시 적 및 비암 시적 인수를 가질 수있는 유일한 방법입니다 .
def gaga [A](x: A)(implicit mf: Manifest[A]) = ???
def gaga2[A](x: A, implicit mf: Manifest[A]) = ???