Scala中函数对象的varargs出错?

时间:2011-12-24 06:33:12

标签: scala syntax variadic-functions

为什么这不起作用?

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

2 个答案:

答案 0 :(得分:24)

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

比较Language Spec

中的函数声明与匿名函数的语法

从4.6函数声明和定义

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

6.23匿名函数

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

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

答案 1 :(得分:2)

Lex Spoon在here

给出了一个很好的解释
  

这里的语法有点误导;也许它太可爱了。 varargs的Any *语法使它看起来像Any *本身就是一个类型。实际上,*是方法参数的注释,而不是类型。

     

当您使用T1 => T2语法记下函数类型时,T1和T2都需要是普通的老式真实类型。 Scala提供各种类型的oodles,但vararg类型不是其中之一。

     

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