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 参数的新柯里化(Currying)函数。
我预计会出现编译器错误或至少是警告。
最佳答案
我想这是由于 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 _
^
尽管我可以解释为什么它会这样工作,但我仍然认为这种行为可以被视为错误。
关于scala - 无法理解 scala 函数应用程序中的占位符 _ 行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17484457/