익명 함수 생성을 걱정하지 말라. 코틀린은 함수가 호출될 때마다 항상 객체를 생성하지는 않는다. 그리고 이런 익명 함수 객체를 생성하는 비용도 싸다. 대신 코드의 명확성과 유지 보수성만을 고려해 함수에 이름을 부여할지 익명 함수를 사용할지 결정하라. 성능이나 재사용성을 걱정한다면 함수 참조를 가능한 한 자주 사용하라.
타입 추론 구현하기
익명 함수를 사용할 때 문제가 될 수 있는 다른 요소로 타입 추론이 있다. 앞 예제에서는 compose 함수가 두 익명 함수를 인자로 받는다는 사실을 알고 컴파일러가 두 익명 함수의 타입을 추론할 수 있었다.
fun <T, U, V> compose(f: (U) -> V, g: (T) -> U): (T) -> V = { f(g(it)) }
하지만 타입 추론이 항상 제대로 동작하는 것은 아니다. 두 번째 인자의 함수 참조를 다음과 같이 람다로 바꾸면,
fun cos(arg: Double) = compose({ x -> Math.PI / 2 - x }, { y -> Math.sin(y)})(arg)
컴파일러가 처리하지 못해서 다음과 같은 오류 메시지를 출력한다.
Error:(48, 28) Kotlin: Type inference failed: Not enough information to infer parameter T in fun <T, U, V> compose(f: (U) -> V, g: (T) -> U): (T) -> V Please specify it explicitly. Error:(48, 38) Kotlin: Cannot infer a type for this parameter. Please specify it explicitly. Error:(48, 64) Kotlin: Cannot infer a type for this parameter. Please specify it explicitly.