Scala неожиданно не может определить тип расширенной функции - PullRequest
28 голосов
/ 09 октября 2009

Почему в Скале дано:

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)

1 Ответ

49 голосов
/ 09 октября 2009

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

В этом случае вам придется написать анонимную функцию, т.е. 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):).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...