Подтвердить что ты не робот

Scala неожиданно не может установить тип для расширенной функции

Почему, в Scala, данный:

a = List(1, 2, 3, 4)
def f(x : String) = { x }

делает

a.map(_.toString)

работает, но

a.map(f(_.toString))

введите ошибку

missing parameter type for expanded function ((x$1) => x$1.toString)
4b9b3361

Ответ 1

Ну... f() берет строку как параметр. Конструкция _.toString имеет тип A <: Any => String. Функция f() ожидает тип String, поэтому приведенный выше пример не вводит проверку. Похоже, что Scala дружелюбен в этом случае и дает пользователю еще один шанс. Сообщение об ошибке означает: "По моим алгоритмам вывода типа это не компилируется. Поместите типы в и, возможно, если это то, что я не могу сделать."

В этом случае вам нужно будет написать анонимную функцию longhand, т.е. a.map(n => f(n.toString)). Это не ограничение вывода типа, а символа подстановки. В основном, когда вы пишете a.map(f(_.toString)), _.toString расширяется до анонимной функции внутри ближайших скобок, которые она может найти, иначе это приведет к огромной двусмысленности. Представьте себе что-то вроде f(g(_.toString)). Означает ли это f(g(x => x.toString)) или f(x => g(x.toString))? Худшие двусмысленности возникнут для нескольких вложенных вызовов функций. Таким образом, проверка типа Scala принимает наиболее логичное решение, как описано выше.

Nitpick: первая строка вашего кода должна быть val a = List(1,2,3,4):).