Tour of Scala

고차 함수

Language

스칼라는 고차 함수의 정의를 허용한다. 이런 함수는 다른 함수를 파라미터로 받거나, 수행의 결과가 함수다. 다음과 같은 함수 apply는 다른 함수 f와 값 v를 받아서 함수 fv에 적용한다.

def apply(f: Int => String, v: Int) = f(v)

주의: 문맥적으로 함수가 필요하다면, 메소드는 자동으로 이에 맞게 강제된다.

다음은 또 다른 예제다.

class Decorator(left: String, right: String) {
  def layout[A](x: A) = left + x.toString() + right
}

object FunTest extends App {
  def apply(f: Int => String, v: Int) = f(v)
  val decorator = new Decorator("[", "]")
  println(apply(decorator.layout, 7))
}

실행 결과는 다음과 같다.

[7]

이 예제에서 메소드 decorator.layout은 메소드 apply에서 요구하는 바와 같이 타입 Int => String의 값으로 자동 강제된다. 메소드 decorator.layout다형성 메소드(즉, 자신의 서명 타입 중 일부를 추상화하는)이고, 스칼라 컴파일러는 가장 적합한 메소드 타입을 인스턴스화 해야만 한다는 점을 명심하자.

윤창석, 이한욱 옮김