Проблема в том, что
List("This","is","Scala").foreach(print(_+" "))
не эквивалентно
List("This","is","Scala").foreach(a => print(a+" "))
, а
List("This","is","Scala").foreach(print(a => a+" "))
Теперь давайте посмотрим на сигнатуру типа foreach
:
def foreach [B] (f: (A) ⇒ B) : Unit
где A
- параметр типа самого List
.Поскольку у нас есть List[String]
, компилятор знает, что нужно передать foreach
a Function[String, B]
.
В a => print(a+" ")
тип a
уже известен: String
.
В print(a => a+" ")
есть проблема, так как print
не Function
.Однако компилятор еще не учел это - он все еще пытается скомпилировать a => a+" "
.Итак, давайте рассмотрим тип Predef.print
:
def print (x: Any) : Unit
Итак, a => a+" "
должен иметь тип Any
, что, конечно, означает, что это может быть что угодно.Это не помогает компилятору утверждать, что тип a
.Что на самом деле не имеет значения, потому что вы не хотели печатать Function
на первом месте.