2010-08-16 23 views
7
List("This","is","Scala").foreach(a => print(a+" ")) 

compila bien, perotipo Scala inferencia con marcador de posición _

List("This","is","Scala").foreach(print(_+" ")) 

es infructuosa quejándose de la falta de tipo de parámetro. No pude entender por qué falla.

EDITAR: Quise decir imprimir no imprimir, no es que logre una diferencia lógica.

+2

Consulte http://stackoverflow.com/questions/2173373/scala-foreach-strange-behaviour/2176548#2176548 para obtener una respuesta más detallada. – huynhjl

Respuesta

7

El problema es que este

List("This","is","Scala").foreach(print(_+" ")) 

no es equivalente a

List("This","is","Scala").foreach(a => print(a+" ")) 

pero a

List("This","is","Scala").foreach(print(a => a+" ")) 

Ahora, vamos a ver la firma tipo de foreach:

def foreach [B] (f: (A) ⇒ B) : Unit 

donde A es el parámetro de tipo de la List sí. Como tenemos un List[String], el compilador sabe que hay que pasar a foreach a Function[String, B].

En a => print(a+" ") el tipo de a ya se conoce entonces: String.

En print(a => a+" ") hay un problema, ya que print no es un Function. Sin embargo, el compilador no lo ha considerado todavía: todavía está tratando de compilar a => a+" ". Así que vamos a ver el tipo de Predef.print:

def print (x: Any) : Unit 

Así a => a+" " debe ser del tipo Any, que, por supuesto, significa que puede ser cualquier cosa. No ayuda al compilador a afirmar cuál es el tipo de a. Lo que realmente no importa, porque no quería imprimir un Function en primer lugar.

6

Scala dice (_+" ") como x => x+" ". Pero println no contiene ningún tipo de información para ayudar al compilador a adivinar qué tipo x podría ser, por lo que da ese error.

Lo que quería hacer era notar que println no funcionó y recurse al revés y lo intenta de nuevo para foreach. Pero no puede hacer eso: println puede tomar cualquier argumento, incluida una función, por lo que x => x+" " es una cosa perfectamente válida para println para tratar de imprimir.

(E incluso en un caso en el que podría, en teoría, dar marcha atrás, no lo hace generalmente.)

Cuestiones relacionadas