Почему я могу использовать имя выражения лямбда, но не имя функции?

Я могу определить «большую» функцию, используя «маленькую» функцию:

fun apply3(a:Int, b:Int, c:Int, func: (Int,Int,Int)->Int ): Int{ return func(a,b,c) } 

Я могу назвать это так:

 println(apply3(1,2,3,{a,b,c->a+b+c})) 

С другой стороны, если я хочу использовать одну и ту же функцию несколько раз и использовать имя для нее, у меня есть проблемы:

 val plus1: (Int,Int,Int)->Int = {a,b,c->a+b+c} //this is OK ... fun plus2(a:Int, b:Int, c:Int)=a+b+c // this too ... println(apply3(1,2,3,plus1)) // this is allowed ... println(apply3(1,2,3,plus2)) // this is NOT allowed 

Последняя строка запрещена. С сообщением:

 Type mismatch Required: (Int,Int,Int)->Int Found: Int 

Зачем? Для меня плюс2 и плюс2 – это то же самое?

У этого сообщения есть ответ, который советует использовать :: plus2 в моем случае. Это помогает технически, но не объясняет разницу между этими двумя функциями.

Вам нужно использовать функцию :

 println(apply3(1,2,3,::plus2))