커링함수 코드 만들기

Swift의 차기 버전에서는 자동 커링 함수를 만드는 기능이 제거된다고 한다.  예를 들어

func add(x: Int)(_ y:Int) -> Int { return x + y }
let plusOne = add(1)
let y = plusOne(4)
// y = 5

이런 형태로 함수를 만들 때부터 커링을 지원하도록 하던 기능이 없어진다. 커링함수는 이 기능을 쓰지 않고도 클로저를 리턴하는 함수를 이용해서 만들 수는 있다.

func curry <A, B, C>(body: (A, B) -> C) -> A -> B -> C {
    return { x in 
        { y in 
            body(x, y)
        }
    }
}

func add(x: Int, y: Int) -> Int { return x + y }
let plusOne = curry(add)(1)
let y = plusOne(4)
// y = 5

이런 커리 함수의 모양은 간단한데, 문제는 인자의 개수만큼 많은 커리 함수를 만들어야 한다는 점이다. 여간 귀찮고 (또 헷갈리는) 작업인 만큼, 이런 커리 함수 코드를 출력해주는 코드를 작성해서 25단 커링 -_- 함수까지 만들어보자.