Curry 해서 어디다 씁니까?

1
2
3
func f<A, B, C, D>(_ a: A, _ b: B, _ c: C) -> D {
....
}

인자를 3개 받는 함수가 f 가 Currying 되면 이렇게 된다.

1
2
3
func f<A, B, C, D>(_ a: A) -> (B) -> (C) -> D {
....
}

결국 Currying 은 인자 여러개의 함수 하나를 인자 하나짜리 함수 여러개로 쪼개는 것이다.

예제같은 것은 조금만 검색해 보면 많이 찾아볼 수 있으니 생략한다.

그보다 왜 커링을 하는지 알아보자.

1. 기능 쪼개기

여러 조건을 인자로 받아서 한번에 처리하는 함수를 커링하면, 각 조건에 따라 별도로 중간 함수를 만들 수 있다.

동일 인자를 계속 반복해서 입력하게 되는 경우가 생기면, 반복되는 인자를 미리 주입시킨 중간함수를 만들어서 재사용 할 수 있다.

(장점이긴 하지만, 뭐 그리 크게 매력적이진 않다.)

2. 함수 합성

커링의 이유는 결국 함수 합성 때문이다. 어떤 함수의 output 이 다른 함수의 input에 입력되면서 함수가 합성이 이루어 지는데, output 은 값이 하나다.

(여러개 output 을 하는 경우는 없다. 있다면 그것은 여러개 값을 튜플로 만들어 튜플 한 개를 전달하는 것이다.)

그러니까 다른 함수의 output 을 받아 합성이 잘 이루어 지려면 input 도 하나여야 한다. 그러니까 인자 하나짜리 함수를 만들어야 한다. 그러니 필요에 의해서 Currying 이 필요하게 된다.

결론

  • 커링은 인자 여러개 함수 하나를, 인자 하나짜리 여러개 함수로 쪼개는 것이다.
  • 이것은 함수의 합성을 잘 써먹기 위해서 필요하다.
  • 그래서 함수를 만들때는 커링을 고려해서 인자의 순서를 잘 설계해야 한다.