Что такое чистая функция?

Я нашел эту цитату:

  1. Make предсказывает чистые функции.

predicate purity: предикат-это объект функции, который возвращает ответ Да / нет, обычно как bool значение. Функция чистого математический смысл, если его результаты зависят только от его аргументов (отметьте, что это использование "чистого" не имеет ничего общего с чисто виртуальными должностные обязанности.)

Не позволяйте предикатам удерживать или состояние доступа, влияющее на результат их оператор(), включая как член, так и глобальное государство. Предпочитаю сделать оператор() a const функции-члены predicatse (см. пункт 15).

Что это чистая функция как указано в этом заявлении и кто-нибудь может привести примеры? Спасибо заранее.

2 ответов


это чистая функция:

int foo(int n)
{
  return n*2;
}

результат вызова зависит только от ее аргументов.

это не чистая функция:

int i = 42;

int bar(int n)
{
  ++i;
  return n*i;
}

возвращаемое значение зависит от вещей, отличных от параметра.


функция чиста, если:

  1. он не имеет семантически наблюдаемых побочных эффектов
  2. всегда возвращает один и тот же результат при одном и том же вводе

таким образом, функция все еще может иметь состояние, но она не должна наблюдаться. Например:

int foo(std::vector<int> v) {

  static std::vector<int> tmp;
  tmp.resize(v.size);

  std::transform(v.begin(), v.end(), tmp.begin(), [](int a) {return a * a;});
  return std::accumulate(tmp.begin(), tmp.end(), 0);
}

функция foo имеет состояние (статический вектор), однако она не семантически наблюдаема, поэтому ее чистая. Это глупая функция, но она должна показать суть.