여러 개의 매개 변수를 받는 함수를 분리하여, 단일 매개 변수만 받는 부분 적용 함수의 체인으로 만드는 방법이다.
함수형 프로그래밍에서 커링을 사용하는 이유는 다양한 재사용과 마지막 매개변수가 입력될 때까지 함수의 실행 타이밍을 조절할 수 있다.
아래 코드는 코틀린의 확장함수를 사용하여 multiThree 함수와 같이 매개변수가 3개인 커링 함수를 일반화 하는 과정이다.
curried() 확장 함수를 사용하여 매개변수가 3개인 함수를 커링 함수로 변환할 수 있다.
반대로 커링 함수를 일반 함수로 변환하는 unCurried() 함수도 구현했다.
class Currying {
fun <P1, P2, P3, R> ((P1, P2, P3) -> R).curried(): (P1) -> (P2) -> (P3) -> R =
{ p1: P1 -> { p2: P2 -> { p3: P3 -> this(p1, p2, p3) } } }
fun <P1, P2, P3, R> ((P1) -> (P2) -> (P3) -> R).uncurried(): (P1, P2, P3) -> R =
{ p1: P1, p2: P2, p3: P3 -> this(p1)(p2)(p3) }
val multiThree = { a: Int, b: Int, c: Int -> a * b * c }
val curried = multiThree.curried()
val uncurried = curried.uncurried()
fun print(){
print(curried) // 6
print(uncurried) // 6
}
}
'Kotlin' 카테고리의 다른 글
[Kotlin] Flow (0) | 2021.08.13 |
---|---|
[Kotlin] 리스트를 통한 명령형 방식과 함수형 방식 비교 (0) | 2021.08.04 |
[Kotlin] Tailrec (0) | 2021.08.02 |
[Kotlin] Sealed Class (0) | 2021.07.30 |
[코틀린] apply, with, let, also, run의 용도 (0) | 2021.03.17 |