Question

Welcome to Scala version 2.10.2
Type in expressions to have them evaluated.
Type :help for more information.

scala> val fn = (x:Int) => x+1
fn: Int => Int = <function1>

scala> val fn1 = fn _
fn1: () => Int => Int = <function0>

scala> val fn2 = fn1 _
fn2: () => () => Int => Int = <function0>

I don't understand why the placeholder(without a suggested type) application to a function is creating a new curried function with prefixed additional void argument.

I was expecting a compiler error or at least a warning.

Was it helpful?

Solution

I guess it's so due to the uniform access principle: in REPL val is a field of object, not a local variable. And all not private[this] fields are getter methods.

So your code is something like this:

def fn() = (x:Int) => x+1
val fn1 = fn _ // () => fn()

It works as expected with local variables:

scala> {
     |   val fn = (x:Int) => x+1
     |   val fn1 = fn _
     | }
<console>:10: error: _ must follow method; cannot follow Int => Int
                val fn1 = fn _
                          ^

Even though I can explain why it works this way, I still think this behavior can be considered a error.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top