더북(TheBook)

하지만 코틀린에서는 독립적인 다형적 프로퍼티를 정의할 수 없다. 파라미터화하려면 타입 파라미터를 정의할 수 있는 영역에 프로퍼티를 넣어야 한다. 그런데 클래스, 인터페이스, fun으로 정의한 함수에만 타입 파라미터를 정의할 수 있다. 따라서 다형적 프로퍼티를 정의하려면 요소 안에 정의를 넣어야 한다. 가장 실용적인 요소는 fun이다.

fun <T, U, V> higherCompose(): ((U) -> V) -> ((T) -> U) -> (T) -> V =
    { f ->
        { g ->
            { x -> f(g(x)) }
        }
    }

higherCompose()라는 fun 함수는 아무 파라미터도 받지 않고 항상 같은 값을 반환한다. 따라서 이 함수는 상수다. 이 함수를 fun으로 정의했다는 사실은 이 함수가 상수라는 관점과는 무관하다. 이 함수는 함수를 합성하는 함수가 아니다. 단지 함수를 합성하는 함수 값을 반환하는 fun 함수일 뿐이다. 반환 타입을 생략하는 쪽을 선호한다면 파라미터의 타입을 지정해야 한다.

fun <T, U, V> higherCompose() =
    { f: (U) -> V ->
        { g: (T) -> U ->
            { x: T -> f(g(x)) }
        }
    }
신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.