We read every piece of feedback, and take your input very seriously.
To see all available qualifiers, see our documentation.
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)