JavaScript. Подробное руководство, 6-е издание
Шрифт:
а = a.concat(array(args,1)); // Добавить внешние арг., начиная с 1.
return f.apply(this, а); // Вызвать f с этим списком аргументов
};
}
// Аргументы этой функции играют роль шаблона. Неопределенные значения
// в списке аргументов заполняются значениями
из внутреннего набора,
function partial(f /*, ... */) {
var args = arguments; // Сохранить внешний массив аргументов
return function {
var a = array(args, 1); // Начинать с внешнего массива аргументов
var i=0, j=0;
// Цикл по этим аргументам, заменить значения undefined значениями
// из внутреннего списка аргументов
for(; і < a.length; i++)
if (a[i] === undefined) a[i] = arguments[j++];
// Добавить оставшиеся внутренние аргументы в конец списка
а = a.concat(array(arguments, j))
return f.apply(this, a);
};
}
// Ниже приводится функция, принимающая три аргумента
var f = function(x,y,z) { return x * (у - z); };
// Обратите внимание на отличия между следующими тремя частичными применениями
partialLeft(f, 2)(3,4) // => -2: Свяжет первый аргумент: 2 * (3 - 4)
partialRight(f, 2)(3,4) // => 6: Свяжет последний аргумент: 3 * (4 - 2)
partial(f, undefined, 2)(3,4) // => -6: Свяжет средний аргумент: 3 * (2 - 4)
Эти функции частичного применения позволяют легко объявлять новые функции на основе уже имеющихся функций. Например:
var increment = partialLeft(sum, 1);
var cuberoot = partialRight(Math.pow, 1/3);
String.prototype.first = partial(String.prototype.charAt, 0);
String.prototype.last = partial(String.prototype.substr, -1, 1);
Прием частичного применения становится еще более интересным, когда он используется
not
, представленной выше, за счет совместного использования приемов композиции и частичного применения:
var not = partialLeft(compose, function(x) { return !x; });
var even = function(x) { return x % 2 === 0; };
var odd = not(even);
var isNumber = not(isNaN)
Прием композиции и частичного применения можно также использовать для вычисления среднего значения и стандартного отклонения в крайне функциональном стиле:
var data = [1,1.З,5,5]; // Исходные данные
var sum = function(x.y) { return x+y; }; // Две элементарные функции
var product = function(x,у) { return x*y; };
var neg = partial(product, -1); // Определения других функций
var square = partial(Math.pow, undefined, 2);
var sqrt = partial(Math.pow, undefined, .5);
var reciprocal = partial(Math.pow, undefined, -1);
// Вычислить среднее и стандартное отклонение. Далее используются только функции
// без каких либо операторов, отчего программный код начинает напоминать
// программный код на языке Lisp!
var mean = product(reduce(data, sum), reciprocal(data.length));
var stddev = sqrt(product(reduce(map(data, compose(square,
partial(sum, neg(mean)))), sum),
reciprocal(sum(data.length,-1))));
8.8.4. Мемоизация
В разделе 8.4.1 была определена функция нахождения факториала, которая сохраняет ранее вычисленные результаты. В функциональном программировании такого рода кэширование называется мемоизацией (memorization). В следующем примере демонстрируется функция
memoize
высшего порядка, которая принимает функцию в виде аргумента и возвращает ее мемоизованную версию:
// Возвращает мемоизованную версию функции f. Работает, только если все возможные
Поделиться:
Популярные книги
Кино
Документальная литература:
публицистика
4.00
рейтинг книги
Врата Мертвого Дома
Малазанская империя
Фантастика:
эпическая фантастика
6.14
рейтинг книги
Перерождение: Монстр
Фантастика:
фэнтези
рпг
попаданцы
7.97
рейтинг книги
Газлайтер. Том 15
15. История Телепата
Фантастика:
боевая фантастика
попаданцы
5.75
рейтинг книги
Кодекс Охотника. Книга XIV
14. Кодекс Охотника
Фантастика:
боевая фантастика
попаданцы
аниме
5.00
рейтинг книги
Да, мой лорд
Фантастика:
фэнтези
5.00
рейтинг книги
Люди, годы, жизнь
Мой 20 век
Документальная литература:
биографии и мемуары
6.00
рейтинг книги
Чужак
1. Ушедший Род
Фантастика:
попаданцы
аниме
фэнтези
5.25
рейтинг книги
Мост через вечность
Научно-образовательная:
философия
8.19
рейтинг книги
Серебряный пояс
Приключения:
исторические приключения
5.00
рейтинг книги
Эпоха Опустошителя. Том I
1. Вечное Ристалище
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Последний Исход
4. Сага о халруджи
Фантастика:
фэнтези
боевая фантастика
5.40
рейтинг книги
Огонь
Любовные романы:
5.00
рейтинг книги
Имперец. Том 3
2. Имперец
Фантастика:
боевая фантастика
попаданцы
альтернативная история
7.50