Skip to content
This repository was archived by the owner on Nov 9, 2017. It is now read-only.

partial

Jung Myung Sung (정명성) edited this page Apr 8, 2017 · 1 revision

함수가 어떤 형식 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인 값을 돌려주는 함수이다.

이런 고차함수를 어떻게 구현해야 할까? 컴파일이 가능한 구현은 단 한 가지이며, 그 구현은 함수의 형식 서명에서 논리적으로 도출된다.

위 함수를 돌려주는 값부터 살펴보면,

partial1의 반환 방식은 B => C 이므로, 반드시 그런 형식의 함수를 돌려줘야 한다.

다시 말하자면, 위 partial1에서 정의된 함수를 보고 역순으로 들어가는 것이다.

리턴 타입이 B => C 라고 명시 했기 때문에

C => B 가 될 수 있다. (=> 는 익명 함수를 나타낸다. 따라서 f(a :A, b: B) => C function (a, b) { return C;} 라고 생각하면된다. )

C = f: (A, B) 이므로 앞서 B 타입의 인자 를 (b :B)로 표시하였고 A타입 a는 (a: A, f: (A,B) => C) 에서 사용하였기 때문에.

(b :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) 이렇게 된다.

Clone this wiki locally