为什么这不起作用?
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
答案 0 :(得分:24)
我不是规范阅读方面的专家,但看起来匿名函数不支持varargs语法。
中的函数声明与匿名函数的语法ParamType ::= Type
| ‘=>’ Type
| Type ‘*’
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 *。