Функция высшего порядка возвращает чистую функцию
Вот пример функции высшего порядка с именем functionA, которая имеет customValue в качестве входных данных и возвращает функцию, которая получает входные данные и использует пользовательское значение для разработки результата:
let functionA = (customValue) => {
let value = customValue || 1;
return input => input * value;
};
Вот некоторые результаты:
functionA()(4)
// => returns 4
functionA(2)(4)
// => returns 8
functionA(3)(4)
// => returns 12
functionA(4)(4)
// => returns 16
Может ли функция, возвращаемая функцией A, считаться чистой?
ОБНОВЛЕНИЕ: примеры выше используют только числовой ввод. Как описано в @CRice, возвращаемую функцию можно считать чистой только в том случае, если customValue является константой и не имеет внутреннего состояния (например, классов).
3 ответа
Используя это определение чистой функции:
В компьютерном программировании чистая функция - это функция, которая имеет следующие свойства:
Его возвращаемое значение одинаково для тех же аргументов (без изменений с локальными статическими переменными, нелокальными переменными, изменяемыми ссылочными аргументами или входными потоками с устройств ввода-вывода).
Его оценка не имеет побочных эффектов (нет мутации локальных статических переменных, нелокальных переменных, изменяемых ссылочных аргументов или потоков ввода-вывода).
Тогда нет functionA
не всегда возвращает чистую функцию.
Вот способ использования functionA
так что он не возвращает чистую функцию:
let functionA = (customValue) => {
let value = customValue || 1;
return input => input * value;
};
class Mutater {
constructor() {
this.i = 0;
}
valueOf() {
return this.i++;
}
}
const nonPureFunction = functionA(new Mutater());
// Produces different results for same input, eg: not pure.
console.log(nonPureFunction(10));
console.log(nonPureFunction(10));
Как видите, возвращаемая функция, когда дан тот же ввод (10
), дает другой результат. Это нарушает первое условие из приведенного выше определения (и, используя тот же прием, вы также можете нарушить второе).
Да, функция, которая возвращается, может считаться чистой. Причина, по которой он считается чистым, заключается в том, что функция всегда будет возвращать один и тот же результат при одинаковых входных данных.
Ваши возвращенные функции могут рассматриваться как чистые функции. В вашем примере у вас фактически есть 4 различных чистых функции.
const pureFunc1 = functionA();
pureFunc1(4) // => returns 4
pureFunc1(4) // => returns 4
const pureFunc2 = functionA(2);
pureFunc2(4) // => returns 8
pureFunc2(4) // => returns 8
// ...