【问题标题】:Unable to understand placeholder _ behavior in scala function application无法理解 scala 函数应用程序中的占位符 _ 行为
【发布时间】:2013-07-05 18:36:03
【问题描述】:
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 参数的新柯里化函数。

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

【问题讨论】:

    标签: scala placeholder void currying


    【解决方案1】:

    我猜是因为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 _
                              ^
    

    尽管我可以解释为什么它会这样工作,但我仍然认为这种行为可以被视为错误。

    【讨论】:

    • @om-nom-nom:感谢您的改进,但不仅public 字段是吸气剂。
    猜你喜欢
    • 2020-04-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多