fun <T, U, V, W> lift3( f: (T) -> (U) -> (V) -> W ): (List<T>) -> (List<U>) -> (List<V>) -> List<W> = { lt -> { lu -> { lv -> lt.map(f).flatMap { lu.map(it) }.flatMap { lv.map(it) } } } } // 추론 불가 List.lift3({ s1 -> { s2 -> { s3 -> s1 + s2 + s3 } } })(List("A", "B"))(List("1", "2"))(List("O", "X")) .forEach(::println) // 제네릭 아규먼트 명시하여 동작하는 코드 List.lift3<String, String, String, String>({ s1 -> { s2 -> { s3 -> s1 + s2 + s3 } } })(List("A", "B"))(List("1", "2"))(List("O", "X")) .forEach(::println)


위에서 List.lift3의 제네릭 파라미터 타입 추론이 안됨

lift3({ ... ])까지만 있으면 안되는게 당연하지만 뒤에 List[String]들을 인자로 넣기 때문에 사람 눈으로는 TUVW가 모두 String임을 추론할 수 있지만

코틀린 컴파일러는 거기까지는 안해줌