fun foo(t: T, f: (T) -> S, g: (S) -> R) {} fun test() { foo(1, { x -> "$x"}, { y -> y.length }) } Resolved call: Candidate descriptor: fun foo(t: T, f: (T) -> S, g: (S) -> R): Unit defined in root package Resulting descriptor: fun foo(t: Int, f: (Int) -> String, g: (String) -> Int): Unit defined in root package Explicit receiver kind = NO_EXPLICIT_RECEIVER Dispatch receiver = NO_RECEIVER Extension receiver = NO_RECEIVER Value arguments mapping: SUCCESS t : Int = 1 SUCCESS f : (Int) -> String = { x -> "$x"} SUCCESS g : (String) -> Int = { y -> y.length }