Прием частичного применения становится еще более интересным, когда он используется в комбинации с функциями высшего порядка. Например, ниже демонстрируется еще один способ определения функции
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. Работает, только если все возможные