Вопрос

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

компилируется нормально, но

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

Не удается жаловаться на отсутствующий тип параметра. Я не мог понять, почему это терпеет неудачу.

Редактировать: Я имел в виду распечатать не печататьLN - не то, что он делает логическую разницу.

Это было полезно?

Решение

Проблема в том, что это

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 а. 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 На первом месте.

Другие советы

Скала читает (_+" ") в виде x => x+" ". Отказ Но println Не содержит информации о типах, чтобы помочь компилятору Угадать, какой тип x может быть, поэтому это дает эту ошибку.

То, что вы хотели, это заметить, что println не работал и не повторялся назад и попробуйте еще раз для foreach. Отказ Но это не может сделать это: println может взять любой аргумент, включая функцию, так x => x+" " совершенно действительная вещь для println Чтобы попытаться распечатать.

(И даже в случае, когда он мог в теории возвращаться, это вообще не.)

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top