¿Error con varargs para objetos de función en Scala?

¿Por qué esto no funciona?

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

Sin embargo, esto funciona perfectamente bien

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

también esto

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

por cierto. Estoy usando scala 2.9.1

No soy un experto en lectura de especificaciones, pero parece que la syntax varargs no es compatible con funciones anónimas.

Compare la syntax de la Declaración de funciones frente a las Funciones anónimas en la Especificación de idioma

De 4.6 Declaraciones y declaraciones de funciones

 ParamType ::= Type | '=>' Type | Type '*' 

6.23 Funciones Anónimas

 Binding ::= (id | '_') [':' Type] 

Aunque no tengo idea de las razones de eso. Parece que hay razones, pero ninguna que pueda explicarse fácilmente. Martin Odersky comentó sobre una solicitud para agregar varargs para funciones anónimas: “Esto parece tentador al principio, pero tendría una gran complejidad (solo tienes que creerme en eso)”.

También hay una buena explicación sobre esto dada por Lex Spoon aquí aquí

La syntax es un poco engañosa aquí; tal vez sea demasiado lindo. La syntax Any * para varargs hace que parezca que Any * es en sí misma un tipo. Realmente, el * es una anotación en el parámetro del método, no en el tipo.

Cuando se escribe un tipo de función con la syntax T1 => T2, tanto T1 como T2 deben ser simples tipos auténticos antiguos. Scala proporciona montones de tipos de tipos, pero los tipos vararg no son uno de ellos.

En el código práctico, la salida es usar explícitamente un tipo de secuencia. De hecho, si nos fijamos en el tipo inferido para good2, verá que involucra Seq [Any] en lugar de Any *.