다중인자리스트

메소드는 여러 파라미터 리스트를 정의할 수 있다.

파라미터리스트의 수보다 적게 호출됐을 경우, 전달되지 않는 파라미터를 인자로 받는 함수를 선언하게 된다.

→ 이를 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

→ 위처럼 괄호로 묶는걸 권장해서 사용하지 않는다.

Drive type inference

→ _ 를 변수로 써서 익명함수로 간략하게 쓸수 있는게 스칼라의 타입 추론 덕이다

→ 스칼라에서는 한번에 하나의 파라미터 리스트에 대해 타입 추론이 통하게 된다.

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 parameters

특정 파라미터를 implicit하기 위해서는 다중 인자 리스트를 써야한다.