더북(TheBook)

연습문제 3-6(이제는 쉬움!)

함수를 합성하되 적용 순서가 반대인 higherAndThen 함수를 정의하라. 적용 순서가 반대라는 말은 higherCompose(f, g)higherAndThen(g, f)가 같다는 말이다.

해법

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

함수 파라미터 테스트하기

파라미터의 순서에 대해 의심이 간다면 다른 타입의 함수를 사용해 이를 테스트해 볼 수 있다. Int에서 Int로 가는 두 함수로 테스트하면 함수를 어떤 순서로든 합성할 수 있기 때문에 합성 순서가 모호하고 그에 따라 오류를 알아내기 어렵다. 다음은 다른 타입의 함수를 사용해 테스트하는 코드다.

fun testHigherCompose() {
    val f: (Double) -> Int = { a -> (a * 3).toInt() }
    val g: (Long) -> Double = { a -> a + 2.0 }

    assertEquals(Integer.valueOf(9), f(g(1L)))
    assertEquals(Integer.valueOf(9),
        higherCompose<Long, Double, Int^gt;()(f)(g)(1L))
}
신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.