无法理解scala函数应用程序中的占位符_行为

时间:2013-07-05 08:31:02

标签: scala placeholder void currying

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函数。

我期待编译器错误或至少发出警告。

1 个答案:

答案 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 _
                          ^

即使我能解释为什么它以这种方式工作,我仍然认为这种行为可以被视为错误。