연습문제 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))
    }
    신간 소식 구독하기
    뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.