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

Перейти к навигации Перейти к поиску
8 байт добавлено ,  3 года назад
</code>
 
где <tt>g</tt> — свежий идентификатор. Или, если короче, с использованием анонимной фунциифункции:
 
<code>
Число <tt>x</tt> называется ''неподвижной точкой'' функции <tt>f</tt>, если <tt>f(x) = x</tt>.
 
Для некоторых функций <tt>f</tt> можно найти неподвижную точку, стартовав с начальной догадки и затем применяя <tt>f</tt> раз за разом, пока значение не перестанет изменяться (или изменения будут не больше некоторого значения). Это возможно, если последовательность <tt>x, f(x), f(f(x)), f(f(f(x))), …</tt> сходится к неподвижной точке <tt>f</tt>. Эта идея выражена в следующей фунциифункции поиска неподвижной точки:
 
<font size=3><syntaxhighlight lang=Scala>
Предыдущий пример показал, что выразительная мощность языка значительно увеличивается, если функции можно передавать как аргументы. Следующий пример показывает, что функции, возвращающие функции, тоже могут быть полезны.
 
Рассмотрим опять итерации неподвижной точки. Мы начали с наблюдения, что <math>\sqrt{(x)}</math> это неподвижная точка функции <tt>y => x / y</tt>. Затем мы свели итерации к неподвижной точке, усредняя последовательные значения. Техника ''торможения усреднением'' настолько часто применяется, что на может быть вынесена в отдельную фунциюфункцию:
 
<font size=3><syntaxhighlight lang=Scala>
== Заключение ==
 
В предыдущей главе мы видели, что функции — это очень важные абстракции, потому что они позволяют нам вводить общие методы вычислений как явные, именованные элементы нашего языка программирования. Настоящая глава показала, что эти абстракции могут быть скомбинированы при помощи функций высшего порядка, для создания дальнейших абстракций. Как программисты, мы должны искать возможности абстрагировать и переиспользовать. Самый высокий возможный уровень асбтракцииабстракции не всегда самый лучший, но важно знать техники абстракции, чтобы уметь использовать их, где это уместно.
 
== Использованные элементы языка ==
 
Главы [[Scala в примерах#Выражения и простые функции|4]] и [[Scala в примерах#Функции первого класса|5]] покрывают элементы языка Scala для выражения выражений и типов, включая примитивные типы и функции. Ниже дан контекстно-свободный синтаксис этих языковых элементов в расширенной форме Бэкуса-Наура, где '<tt>|</tt>' обозначает альтернативы, <tt>[…]</tt> обозначает опцию (вхождение 1 или 0 раз), и <tt>{…}</tt> обозначает повтороениеповторение (0 или больше вхождений).
 
 
Литералы — те же, что и в Java. Они определяют числа, символы, строки и булевские величины. Примеры литералов: <tt>0</tt>, <tt>1.0e10</tt>, <tt>'x'</tt>, <tt>"he said "hi!""</tt> или <tt>'''true'''</tt>.
 
Идентификаторы могут быть двух видов. Они начинаются либо с буквы, за которой идет (возможно, пустая) последовательность букв и символов, либо с операторного символа, за которым идет (возможно, пустая) последовательность операторных символов. Оба вида идентификаторов могут содержать символы подчеркивания. За символом подчеркивания могут идти идентификатрыидентификаторы любого типа. Например, следующие идентификатрыидентификаторы корректны: <tt>x&nbsp; Room10a&nbsp; +&nbsp; --&nbsp; foldl_:&nbsp; +_vector</tt>.
 
Это следует из правила, что следующие друг за другом оператор и идентификатор должны разделяться пробелом. Например, ввод <tt>x+-y</tt> будет распознан как последовательность из трех токенов <tt>x</tt>, <tt>+-</tt>, <tt>y</tt>. Если мы хотим выразить сумму <tt>x</tt> и значения <tt>-y</tt>, нам нужно добавить по крайней мере один пробел: <tt>x+ -y</tt>.
93

правки

Навигация