Вывод типа Scala с _ Place Holder
-
28-09-2019 - |
Вопрос
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
Чтобы попытаться распечатать.
(И даже в случае, когда он мог в теории возвращаться, это вообще не.)