There was an error while loading. Please reload this page.
함수가 어떤 형식 A에 대해 다형적이면, A에 대해서는 오직 인수들로서 함수에 전달된 연산들(또는 그러한 연산들로 정의할 수 있는 연산들)만 수행할 수 있다.
한 가지 방식으로만 구현할 수 있는 함수 서명의 예로, 부분 적용(partial application)이라고 부르는 작업을 수행하는 고차 함수를 살펴보자.
def partial1[A,B,C](a: A, f: (A,B) => C): B => C
partial1 함수에는 A,B,C라는 세 개의 형식 매개변수가 있다. 그리고 이 함수는 인수 두개를 받는다.
인수 f는 형식이 각각 A,B인 인수 두 개를 받고 형식이 C인 값을 돌려주는 함수이다.
f
A
B
C
이런 고차함수를 어떻게 구현해야 할까? 컴파일이 가능한 구현은 단 한 가지이며, 그 구현은 함수의 형식 서명에서 논리적으로 도출된다.
위 함수를 돌려주는 값부터 살펴보면,
partial1의 반환 방식은 B => C 이므로, 반드시 그런 형식의 함수를 돌려줘야 한다.
partial1
B => C
다시 말하자면, 위 partial1에서 정의된 함수를 보고 역순으로 들어가는 것이다.
리턴 타입이 B => C 라고 명시 했기 때문에
C => B 가 될 수 있다. (=> 는 익명 함수를 나타낸다. 따라서 f(a :A, b: B) => C function (a, b) { return C;} 라고 생각하면된다. )
C => B
=>
f(a :A, b: B) => C
C = f: (A, B) 이므로 앞서 B 타입의 인자 를 (b :B)로 표시하였고 A타입 a는 (a: A, f: (A,B) => C) 에서 사용하였기 때문에.
f: (A, B)
(b :B)
(a: A, f: (A,B) => C)
(b :B) => C 타입이라고 하였으니
(b :B) => C
(b :B) => f(a, b) 형식이 된다.
(b :B) => f(a, b)
따라서 def partial1[A, B, C](a: A, f: (A, B) => C): B => C = (b :B) => f(a, b) 이렇게 된다.
def partial1[A, B, C](a: A, f: (A, B) => C): B => C = (b :B) => f(a, b)