【问题标题】:Error with varargs for function-objects in Scala?Scala中函数对象的可变参数错误?
【发布时间】:2011-12-24 06:33:11
【问题描述】:

为什么这不起作用?

val f = (args: Int*) => args.sum

error: ')' expected but identifier found.
val f = (args: Int*) => args.sum
                  ^

然而这工作得很好

def sum(args: Int*) = args.sum
val f = sum _

这也是

val f: (Int*) => Int = args => args.sum

顺便说一句。我正在使用 scala 2.9.1

【问题讨论】:

    标签: scala syntax variadic-functions


    【解决方案1】:

    我不是规范阅读方面的专家,但看起来匿名函数不支持可变参数语法。

    比较Language Spec中函数声明与匿名函数的语法

    从 4.6 函数声明和定义开始

    ParamType ::= Type
                  | ‘=>’ Type
                  | Type ‘*’
    

    6.23 匿名函数

    Binding ::= (id | ‘_’) [‘:’ Type]
    

    我不知道这是什么原因。似乎有原因,但没有一个可以轻易解释。 Martin Odersky 评论了为匿名函数添加可变参数的请求:“起初这看起来很诱人,但它会带来很多复杂性(你只需要相信我就行了)。”

    【讨论】:

    【解决方案2】:

    Lex Spoon 在这里here 对此也给出了很好的解释

    这里的语法有点误导;也许是太可爱了。可变参数的 Any* 语法使它看起来 Any* 本身就是一种类型。真的,* 是方法参数上的注解,而不是类型上的注解。

    当您使用 T1=>T2 语法写下函数类型时,T1 和 T2 都需要是普通的旧的真正类型。 Scala 提供了多种类型,但可变参数类型不是其中之一。

    在实际代码中,出路是显式使用序列类型。事实上,如果你看一下推断的类型 good2,你会发现它涉及 Seq[Any] 而不是 Any*。

    【讨论】:

      猜你喜欢
      • 2011-01-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-07
      • 1970-01-01
      • 2018-06-28
      • 1970-01-01
      • 2021-04-19
      相关资源
      最近更新 更多