연습문제 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)) }