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

Содержимое удалено Содержимое добавлено
→‎Анонимные функции: — добавлен перевод
Строка 625:
 
== Анонимные функции ==
 
Параметризация по функциям располагает к созданию множества маленьких функций. В предыдущем примере мы определили <tt>id</tt>, <tt>square</tt> и <tt>power</tt> как отдельные функции, так что их можно было передавать в качестве аргументов в <tt>sum</tt>.
 
Вместо того, чтобы определять поименованные функции для этих небольших функций-аргументов, можно сформулировать их короче как ''анонимные функции''. Анонимная функция это выражение, вычисляющееся в функцию, функция, определенная без имени. Для примера рассмотрим анонимную функцию возведения в квадрат:
 
<font size=3><syntaxhighlight lang=Scala>
(x: Int) => x * x
</syntaxhighlight></font>
 
Часть перед стрелкой — параметры функции, часть после нее — тело функции. Вот, например, анонимная функция, перемножающая два аргумента:
 
<font size=3><syntaxhighlight lang=Scala>
(x: Int, y: Int) => x * y
</syntaxhighlight></font>
 
Используя анонимные функции, можно перефрмулировать первые две суммирующие функции, не именуя вспомогательных функций:
 
<font size=3><syntaxhighlight lang=Scala>
def sumInts(a: Int, b: Int): Int = sum((x: Int) => x, a, b)
def sumSquares(a: Int, b: Int): Int = sum((x: Int) => x * x, a, b)
</syntaxhighlight></font>
 
Часто компилятор Scala может выводить типовые параметры из контекста анонимных функций, и в этих случаях типовые параметры можно опускать. Например, в случае <tt>sumInts</tt> или <tt>sumSquares</tt> из типа <tt>sum</tt> понятно, что первый параметр должен быть функцией типа <tt>Int => Int</tt>. Заметьте, что типовой параметр <tt>Int</tt> избыточен и может быть опущен. Если есть только один параметр без типа, можно также опустить скобки вокруг него:
 
<font size=3><syntaxhighlight lang=Scala>
def sumInts(a: Int, b: Int): Int = sum(x => x, a, b)
def sumSquares(a: Int, b: Int): Int = sum(x => x * x, a, b)
</syntaxhighlight></font>
 
Выражение Scala <tt>(x<sub>1</sub>: T<sub>1</sub>, …, x<sub>n</sub>: T<sub>n</sub>) => E</tt> определяет функцию, которая соотносит свои параметры <tt>x<sub>1</sub>, …, x<sub>n</sub></tt> с результатами выражения <tt>E</tt> (где <tt>E</tt> может ссылаться на <tt>x<sub>1</sub>, …, x<sub>n</sub></tt>). Анонимные функции — не основные элементы языка Scala, поскольку они всегда могут быть выражены через именованные функции. Действительно, анонимная функция
 
<code>
(x<sub>1</sub>: T<sub>1</sub>, …, x<sub>n</sub>: T<sub>n</sub>) => E
</code>
 
эквивалентна блоку
 
<code>
{ def f (x<sub>1</sub>: T<sub>1</sub>, …, x<sub>n</sub>: T<sub>n</sub>) = E ; f _ }
</code>
 
где <tt>f</tt> — свежее имя, которое больше не используется нигде в программе. Можно сказать, что анонимные функции это "синтаксический сахар".
 
== Каррирование ==