다중인자리스트
메소드는 여러 파라미터 리스트를 정의할 수 있다.
파라미터리스트의 수보다 적게 호출됐을 경우, 전달되지 않는 파라미터를 인자로 받는 함수를 선언하게 된다.
→ 이를 partial application이라고 한다.
trait Iterable[A]:
...
def foldLeft[B](z: B)(op: (B, A) => B): B
...
op에서 초기값 z를 적용해주고 다른 요소들을 왼쪽에서 오른 쪽으로 출력해준다.
아래의 예시 참고
val numbers = List(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
val res = numbers.foldLeft(0)((m, n) => m + n)
println(res) // 55
→ 위처럼 괄호로 묶는걸 권장해서 사용하지 않는다.
→ _ 를 변수로 써서 익명함수로 간략하게 쓸수 있는게 스칼라의 타입 추론 덕이다
→ 스칼라에서는 한번에 하나의 파라미터 리스트에 대해 타입 추론이 통하게 된다.
def firstWay = foldLeft1[Int, Int](numbers, 0, _ + _)
def secondWay = foldLeft1(numbers, 0, (a: Int, b: Int) => a + b)
That’s because Scala won’t be able to infer the type of the function _ + _
, as it’s still inferring A
and B
. By moving the parameter op
to its own parameter list, A
and B
are inferred in the first parameter list. These inferred types will then be available to the second parameter list and _ + _
will match the inferred type (Int, Int) => Int
특정 파라미터를 implicit하기 위해서는 다중 인자 리스트를 써야한다.