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参数的新curried函数。
我期待编译器错误或至少发出警告。
答案 0 :(得分:3)
我想这是因为uniform access principle:在REPL中val
是一个对象的字段,而不是一个局部变量。并且所有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 _
^
即使我能解释为什么它以这种方式工作,我仍然认为这种行为可以被视为错误。