Функция более высокого порядка возвращает чистую функцию
Здесь приведен пример функции более высокого порядка, называемой функцией A, которая имеет 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 считаться чистой?
UPDATE: приведенные выше примеры используют только числовой ввод. Как описано в @CRice, возвращаемая функция может считаться чистой только тогда, когда customValue является константой и не имеет внутреннего состояния (например, классов).
Ответы
Ответ 1
Используя это определение Чистой функции:
В компьютерном программировании чистая функция - это функция, которая обладает следующими свойствами:
-
Его возвращаемое значение одинаково для тех же аргументов (без изменений с локальными статическими переменными, нелокальными переменными, изменяемыми ссылочными аргументами или входными потоками от устройств ввода/вывода).
-
Его оценка не имеет побочных эффектов (без мутации локальных статических переменных, нелокальных переменных, изменяемых ссылочных аргументов или потоков ввода-вывода).
Тогда нет, 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));
Ответ 2
Да, функция, которая возвращается, может считаться чистой. Причина, по которой он считается чистым, заключается в том, что функция всегда будет возвращать один и тот же результат, учитывая тот же самый вход.
Ответ 3
Ваши возвращенные функции могут рассматриваться как чистая функция. В вашем примере у вас есть фактически 4 разные чистые функции.
const pureFunc1 = functionA();
pureFunc1(4) // => returns 4
pureFunc1(4) // => returns 4
const pureFunc2 = functionA(2);
pureFunc2(4) // => returns 8
pureFunc2(4) // => returns 8
// ...