Can't pass a fun


#1

I was surprised to learn that the following Kotlin code does not compile

fun outer (x : Int) : (Int) -> Int {   fun inner (y : Int) : Int {   return x + y   }   return inner }

Instead, one has to write

fun outer (x : Int) : (Int) -> Int{   val inner = {(y : Int) : Int ->   x + y   }   return inner }

While the second form may be "more correct" in some sense, it is less clear (inner is declared as a val, not a fun). Any reason not to support the first form, as Python does?


#2

You should say "::inner" instead of "inner" to indicate that your function is passed as a value. This will make your first example work.


#3

Nice. Although from a language aesthetics POV, I don't see why `return inner` doesn't automatically resolve to `return ::inner`. The nitpicker in me is asking whether the extra fuss serves a purpose. I'm pretty sure it doesn't 'cause if it did, Python would have a problem.


#4

Don't forget that Python is a dynamic language. For one thing, it doesn't have overloading, and :: syntax reserves space for overload disambiguation. Another thing is that :: may create a new object, and that may have a performance impact, which Python users are likely to care little about, but JVM users prefer to see.


#5

Makes sense. Thanks for the explanation.