Что такое чистая функция?
Я нашел эту цитату:
- 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;
}
возвращаемое значение зависит от вещей, отличных от параметра.
функция чиста, если:
- он не имеет семантически наблюдаемых побочных эффектов
- всегда возвращает один и тот же результат при одном и том же вводе
таким образом, функция все еще может иметь состояние, но она не должна наблюдаться. Например:
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 имеет состояние (статический вектор), однако она не семантически наблюдаема, поэтому ее чистая. Это глупая функция, но она должна показать суть.