2017-11-10 2 views
1

부분적으로 varargs로 카레 함수를 적용하는 것에 이상한 점이 있습니다. 이 예제를 고려하십시오부분적으로 적용된 함수를 varargs로 정의하고 호출 하시겠습니까?

def adder(a: Int)(b: Int*) = b.map(_ + a) 

adder(1)(1,2,3,4)  // res1: Seq[Int] = ArrayBuffer(2, 3, 4, 5) 
val add2 = adder(2) _ // add2: Seq[Int] => Seq[Int] 
add2(1,2,3,4)   // Fails to compile 
add2(Seq(1,2,3,4)  // res3: Seq[Int] = List(3, 4, 5, 6) 

나는 previous question의 알고 있지만, 나는 아직도 컴파일러는이 작업을 수행하는 이유와 이러한 경우 일부 영리한 해결책이 있는지 알고 싶습니다.

답변

2

이것은 스칼라에서는 메서드와 함수가 다른 것들이기 때문입니다. 방법은 ETA 확장 method _ 작업을 수행 할 때 방법은 단순히 Function0Function22에 특성의 인스턴스 인 기능으로 변환됩니다

등 유형 매개 변수, 기본 및 명명 된 인수, 변수 인수, 암시 적 인수 목록을 지원하고, 아무튼 이러한 기능을 지원하지 않습니다.

축약 형 Int => String 또는 (A, B) => R을 사용하여 함수 유형을 표현할 수 있습니다. 반면에 메소드에는 non-value types이 있으며 스칼라 프로그램에서 이러한 유형을 참조하는 일반적인 방법은 없습니다.

case class adder(a: Int) { 
    def apply(b: Int*) = b.map(_ + a) 
} 

지금 작동 :

scala> adder(1)(1,2,3,4) 
res1: Seq[Int] = ArrayBuffer(2, 3, 4, 5) 

scala> val add2 = adder(2) 
add2: adder = adder(2) 

scala> add2(1,2,3,4) 
res2: Seq[Int] = ArrayBuffer(3, 4, 5, 6) 
는 가변 인자, 또는 기타 방법 기능을 지원하는 호출 변수를 가지고 싶다면

, 당신은 적절한 apply 방법으로 개체를 반환 할 수 있습니다

관련 문제