프로그래밍/프로그래밍언어

[4장 고차함수] 커링함수

Hithero 2021. 12. 1. 20:43

커링(currying) : 여러개의 매개변수 받는 함수를 분리 -> 단일매개변수로 받는 체인 함수

아래의 예시를 보자.

fun addTwo(a : Int, b : Int) : Int = a+b 

fun addTwoCurried(a : Int) : {b : Int -> { a+b } }

addTwo와 같이 a,b 두개의 매개변수로 받는 함수를 addTwoCurried와 같이 매개 변수 하나씩 받으며 하나의 체인으로 연결되는 함수를 의미한다.

addTwo(1,2) 와 addTwoCurried(1)(2) 와 동일한 3을 출력한다. 

커링으로 변환해주는 함수는 아래와 같을 것이다.

fun addTwo(a : Int, b : Int) : Int = a+b 

fun addTwoCurried(a : Int) : {b : Int -> { a+b } }

fun main(args : Array<String>){
    println(addTWo(1,2)) // 3
    
    val partial = addTWoCurried(1)
    val ret = partial(2)
    println(ret) // 3 
    
    println(addTwoCurried(1)(2)) // 3
}

3개의 println모두 같은 결과를 출력한다.

- 커링의 장점 

1. 부분 적용함수(위의 예시에서는 partial 변수) 를 다양하게 재사용 가능

2. 마지막 매개변수가 입력될 떄까지 함수의 실행을 늦출 수 있다.

    -> lazy evaluation과 관련있어 보인다. 

- Lazy evaluation/(느긋한 계산법)의 특징

        1. 실행을 더 빠르게 한다.

        2. 복합 수식을 계산할 때 오류 상태를 피할 수 있다.

        3. 무한 자료 구조 사용가능

 

 

참고문헌

느긋한 계산법 : https://ko.wikipedia.org/wiki/%EB%8A%90%EA%B8%8B%ED%95%9C_%EA%B3%84%EC%82%B0%EB%B2%9

코틀린으로 배우는 함수형 프로그래밍 (조재용, 우명인 지음) 인사이트

728x90
반응형