Понять сигнатуру частично примененной функции для литерала функции - PullRequest
0 голосов
/ 11 июня 2019

Мне трудно понять сигнатуру частично примененной функции для литерала функции. Например, рассмотрим следующие определения функций и методов, которые работают одинаково:

def meth(x: Int): Unit = ()
val func = (x: Int) => ()

Теперь создайте частично примененную функцию из каждого метода / функции выше. Обратите внимание на подписи полученной функции:

val f = meth _  // Int => Unit
val g = func _  // () => Int => Unit

Я не понимаю, почему подпись func _ включает в себя () => часть, что означает, что g должен называться как g()(1), а не g(1).

1 Ответ

2 голосов
/ 11 июня 2019

Например, рассмотрим следующие определения функций и методов, которые работают одинаково:

Методы и функции не одинаковы в Scala. Они на самом деле очень разные. Методы не являются объектами первого класса, тогда как функции. То есть у вас никогда не будет переменной, тип которой является типом метода.

Как следствие этого, давайте посмотрим на типы без подчеркивания.

val f = meth
val g = func

Поскольку meth - это метод, он будет , называемый . Поэтому первая строка будет пытаться вызвать meth() без аргументов, ошибка. func, однако, это обычное значение, поэтому проблем нет. У нас просто будет другой псевдоним func, называемый g.

val f = meth _
val g = func _

Чтобы позволить нам рассматривать методы как объекты, Scala вводит синтаксис _. При использовании с методом он преобразует этот метод в функциональный объект. Так что meth _ - это специальный синтаксис метода, который превращает его в функцию. С другой стороны, func _ принимает значение (помните, что функции - это объекты, как строки или что-то еще) и поднимает его, чтобы он стал функциональным объектом. Самый простой способ сделать это - добавить пустой список аргументов, так что это именно то, что делает Scala.

tl; dr Установка _ после имени превращает вещь в функциональный объект. Если вещь является методом, она не применяется. Если вещь является значением (включая, но не ограничиваясь функцией), она создает новый объект функции.

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