Scala 中函数对象的可变参数错误?

问题描述 投票:0回答:2

为什么这不起作用?

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
2个回答
25
投票

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

比较 Language Spec

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

来自 4.6 函数声明和定义

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

6.23 匿名函数

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

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


3
投票

Lex Spoon 对此也有很好的解释这里

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.