вывод типа scala с _ заполнителем - PullRequest
7 голосов
/ 16 августа 2010
List("This","is","Scala").foreach(a => print(a+" "))

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

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

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

РЕДАКТИРОВАТЬ: я имел в виду печать не println - не то, чтобы это имело логическое значение.

Ответы [ 2 ]

7 голосов
/ 16 августа 2010

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

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

6 голосов
/ 16 августа 2010

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

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

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

...