Scala в примерах: различия между версиями

Содержимое удалено Содержимое добавлено
→‎Анонимные функции: — добавлен перевод
Строка 1080:
</syntaxhighlight></font>
 
Помимо <tt>Function1</tt> есть также определения для функций любой другой арности (нынешняя реализация устанавливает некий разумный предел). То есть, для любого возможного числа параметров есть соответствующее определение. Синтаксис типа функции в Scala ''<tt>(T<sub>1</sub>, …, T<sub>n</sub>) => S''</tt> — это просто сокращение для параметризованого типа <tt>Function</tt>''n''[T<sub>1</sub>, …, T<sub>n</sub>, S]''</tt>.
 
Scala использует одинаковый синтаксис ''f(x)'' для применения функции, вне зависимости от того, является ли ''f'' методом или функциональным объектом. Это возможно из-за следующей конвенции: применение функции ''f(x)'', где ''f'' — объект (в противоположность методу) это укороченная запись для ''f''.<tt>apply</tt>(''(x)''). Метод <tt>apply</tt>, принадлежащий типу функций, вставляется автоматически, где необходимо.
 
Поэтому мы определяли операцию взятия элемента из массива в [[Scala в примерах#Аннотации вариантности|параграфеПараграфе 8.2]] при помощи метода <tt>apply</tt>. Для любого масива <tt>a</tt> операция взятия элемента <tt>a(i)</tt> это укороченная запись <tt>a.apply(i)</tt>.
 
Функции — это пример того, как полезны объявления контравариантных типовых параметров. Рассмотрим, например, следующий код:
Строка 1094:
</syntaxhighlight></font>
 
Присваивать значение <tt>g</tt> типа <tt>String => Int</tt> величине <tt>f</tt> типа <tt>AnyRef => Int</tt> — корректно. Действительно, все, что можно сделать с функцией типа <tt>String => Int</tt> — это передать ей строку, чтобы получить целое число. Очевидно, что то же самое верно для функции <tt>f</tt>: если мы передадим ей строку (или любой другой объект), мы получим целое число. Это показывает, что подтипирование функций контравариантно по типу аргумента, тогда как оно ковариантно по типу результата. Короче говоря, ''<math>S =>\Rightarrow T''</math> это подтип <math>S''S‘ =>\Rightarrow T‘'T'</math>, если <math>S''S‘''</math> — подтип ''<math>S''</math> и ''<math>T''</math> — подтип <math>T''T‘''</math>.
 
'''Пример 8.6.1''' Рассмотрим код: