[kotlin] 코틀린에서 람다식과 고차 함수를 사용하여 커링(currying)과 같은 기법을 구현하기

커링(currying)은 다중 인수를 가진 함수를 단일 인수를 갖는 여러 개의 함수들로 바꾸는 기법입니다. 코틀린에서는 람다식과 고차 함수를 이용하여 커링을 구현할 수 있습니다.

람다식을 활용한 커링 구현

커링을 구현하기 위해선 먼저 두 개의 파라미터를 받는 함수를 재귀적으로 단일 파라미터를 받는 함수들로 변환하는 것이 중요합니다. 람다식을 사용하면 이러한 변환을 쉽게 할 수 있습니다.

아래는 람다식을 사용하여 커링을 구현하는 간단한 예제입니다.

fun <A, B, C> curry(f: (A, B) -> C): (A) -> (B) -> C {
    return { a -> { b -> f(a, b) } }
}

fun add(a: Int, b: Int): Int {
    return a + b
}

fun main() {
    val curriedAdd = curry(::add)
    val add3 = curriedAdd(3)
    val result = add3(5) // result is 8
}

curry 함수는 두 개의 파라미터를 받는 함수를 감싸는 람다식을 반환합니다. 그리고 add 함수를 curry 함수에 넘겨 커링된 새로운 함수를 만들 수 있습니다.

고차 함수를 활용한 커링 구현

코틀린의 고차 함수를 사용하여 간단하게 커링을 구현할 수도 있습니다.

fun <A, B, C> curry(f: (A, B) -> C): (A) -> (B) -> C {
    return { a -> { b -> f(a, b) } }
}

fun add(a: Int, b: Int): Int {
    return a + b
}

fun main() {
    val curriedAdd = ::add.curried()
    val add3 = curriedAdd(3)
    val result = add3(5) // result is 8
}

curry 함수는 고차 함수로도 작성할 수 있습니다. 위의 예제에서 ::add.curried()에 의해 커링된 새로운 함수를 만들 수 있습니다.

코틀린에서는 람다식과 고차 함수를 통해 커링과 같은 기법을 쉽게 구현할 수 있습니다.

참고문헌: