Scala: нормальные функции против функций с корреляцией? - PullRequest
6 голосов
/ 29 ноября 2011

Какая разница между ними? Я знаю, что их сигнатуры типов различны, и что все функции начинаются нормально и должны иметь .tupled, чтобы получить свою кортежную форму. В чем преимущество использования незаполненных (но не каррированных) функций? Особенно потому, что мне кажется, что передача нескольких аргументов в функцию-кортеж в любом случае автоматически распаковывает их, поэтому, по всей видимости, они одинаковы.

Единственное отличие, которое я вижу, состоит в том, что он заставляет вас иметь типы для каждого числа аргументов функции: Function0, Function1, Function2, Function3 и т. Д., Тогда как функции с кортежами всего лишь Function1[A, R], но это похоже на обратную сторону. В чем заключается большое преимущество использования функций с ненулевыми значениями, что они используются по умолчанию?

Ответы [ 2 ]

7 голосов
/ 29 ноября 2011

Кортежные функции требуют, чтобы объект кортежа создавался при их вызове (если аргументы уже не упакованы в кортеж). Не кортежные функции просто определяют метод, который принимает соответствующее количество аргументов. Таким образом, учитывая архитектуру JVM, функции без кортежей более эффективны.

3 голосов
/ 29 ноября 2011

Рассмотрим этот пример:

scala> def mult = (x: Int, y: Int) => x * y
mult: (Int, Int) => Int

scala> val list = List(1, 2, 3)
list: List[Int] = List(1, 2, 3)

scala> list zip list map mult
<console>:10: error: type mismatch;
 found   : (Int, Int) => Int
 required: ((Int, Int)) => ?
              list zip list map mult
                                ^

scala> list zip list map mult.tupled
res4: List[Int] = List(1, 4, 9)

Есть много ситуаций, когда вы заканчиваете соединением элементов в кортежах. В таких ситуациях вам нужна функция с кортежем для ее обработки. Но есть много других мест, где это не правда! Например:

scala> list.foldLeft(1)(mult)
res5: Int = 6

scala> list.foldLeft(1)(mult.tupled)
<console>:10: error: type mismatch;
 found   : ((Int, Int)) => Int
 required: (Int, Int) => Int
              list.foldLeft(1)(mult.tupled)
                                    ^

Таким образом, в сущности, в Scala существует дихотомия между кортежами и параметрами, что означает, что вы должны преобразовывать функции из кортежей в функции без кортежей и наоборот здесь и там.

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