2
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>

我不明白为什么函数的占位符(没有建议的类型)应用程序正在创建一个带有前缀附加 void 参数的新柯里化函数。

我期待一个编译器错误或至少一个警告。

4

1 回答 1

3

我想这是由于统一访问原则:在 REPLval中是对象字段,而不是局部变量。所有非private[this]字段都是 getter 方法。

所以你的代码是这样的:

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

它使用局部变量按预期工作:

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

即使我可以解释为什么它会这样工作,我仍然认为这种行为可以被认为是错误的。

于 2013-07-05T08:42:49.313 回答