Функция более высокого порядка возвращает чистую функцию

Здесь приведен пример функции более высокого порядка, называемой функцией 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

Используя это определение Чистой функции:

В компьютерном программировании чистая функция - это функция, которая обладает следующими свойствами:

  1. Его возвращаемое значение одинаково для тех же аргументов (без изменений с локальными статическими переменными, нелокальными переменными, изменяемыми ссылочными аргументами или входными потоками от устройств ввода/вывода).

  2. Его оценка не имеет побочных эффектов (без мутации локальных статических переменных, нелокальных переменных, изменяемых ссылочных аргументов или потоков ввода-вывода).

Тогда нет, 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

// ...