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.
Consulte http://stackoverflow.com/questions/2173373/scala-foreach-strange-behaviour/2176548#2176548 para obtener una respuesta más detallada. – huynhjl