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

Содержимое удалено Содержимое добавлено
Нет описания правки
Строка 81:
Обе реализации, и императивная, и функциональная, имеют одинаковую асимптотическую сложность — ''O(N log (N))'' в среднем и ''O(N²)'' в худшем случае. Но если императивная версия непосредственно оперирует элементами массива, используя прямую адресацию, то функциональная при каждом рекурсивном вызове возвращает новый отсортированный массив, оставляя без изменения массив, переданный как аргумент. Следовательно, функциональная реализация требует больше памяти для выполнения.
 
Функциональная реализация создает впечатление, что Scala это специализированный язык для функциональных операций на массивах. На самом деле все операции, использовавшиеся в примере, это просто библиотечные методы класса ''последовательности'' <tt>Seq[tT]</tt> из стандартной библиотеки Scala, которая сама реализована на Scala. Поскольку массивы — это экземпляры класса <tt>Seq</tt>, все его методы доступны им.
 
В частности, метод <tt>filter</tt>, который принимает в качестве аргумента функцию — ''предикатная функция''. Предикатная функция должна переводить элементы массива в булевские значения. Результат выполнения <tt>filter</tt> — массив, состоящий из тех элементов исходного массива, которые удовлетворяют предикату, то есть на которых предикатная функция возвращает true. Метод <tt>filter</tt> класса <tt>Array[tT]</tt>, следовательно, имеет сигнатуру
 
<div style="width: 450px"><font size=3><syntaxhighlight lang=Scala>