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

标签 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 参数的新柯里化(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/

相关文章:

scala - Scala Streams 中如何实现不变性?

java - 从 Scala AnyVal 类型到 Java 类型的不需要的转换

scala - 在 Scala 中定义从字符串到函数的映射

css - 如果使用基础,如何更改输入文本占位符颜色

ASP.NET MVC5 占位符中的字体很棒

c++ - 接口(interface)中虚函数的返回值

java - 如何从另一个类访问 void 方法?

scala - 如何在 Scala 中用另一种方法包装具有隐式的方法?

结构中数组的 C Malloc

django - 如何在 Django 中删除 EmailField 上的占位符?