Чистота функции: различия между версиями

Материал из Википедии — свободной энциклопедии
Перейти к навигации Перейти к поиску
[непроверенная версия][непроверенная версия]
Содержимое удалено Содержимое добавлено
Строка 32: Строка 32:
* [[Обсуждение:Чистота языка программирования]]
* [[Обсуждение:Чистота языка программирования]]
* [[:en:Talk:Referential_transparency|Обсуждение в английском сегменте wikipedia]]
* [[:en:Talk:Referential_transparency|Обсуждение в английском сегменте wikipedia]]
* [http://lambda-the-ultimate.org/node/view/1237 Обсуждение на labda-the-ultimate]
* [http://lambda-the-ultimate.org/node/view/1237 Обсуждение на lambda-the-ultimate]


[[Категория:Функциональное программирование]]
[[Категория:Функциональное программирование]]

Версия от 12:10, 10 октября 2007

В функциональных языках программирования, чистая функция, это функция, которая

  1. Является детерминированой;
  2. Не обладает побочными эффектами.

Наличие только одного из свойств недостаточно, для того чтобы функция была чистой.

Детерминированность функции

Недетерминированность функции — возможность возвращения функцией разных значений несмотря на то, что ей передаётся на вход одинаковые значения входных аргументов. В этом случае невозможно построить однозначную таблицу значений функции; для таких функций таблицы значений выглядят как список (может быть, бесконечный) возможных значений, которые функция принимает на заданном наборе входных параметров.

Функция является детерминированной, если для одного и того же набора входных значений она возвращает одинаковый результат.

Побочные эффекты функции

В императивных языках некоторые функции в процессе выполнения своих вычислений могут читать и модифицировать значения глобальных переменных, осуществлять операции ввода/вывода, реагировать на исключительные ситуации, вызывая их обработчики. Такие функции называются функциями с побочными эффектами. Другим видом побочных эффектов является модификация переданных в функцию параметров (переменных), когда в процессе вычисления выходного значения функции изменяется и значение входного параметра.

Описывать функции без побочных эффектов позволяет практически любой язык программирования. Однако некоторые языки поощряют или даже требуют от некоторых видов функций использования побочных эффектов. Например, во многих объектно-ориентированных языках в функцию-член класса передаётся скрытый параметр — указатель на экземпляр класса, от имени которого вызывается соответствующая функция (например, в C++ этот параметр называется this, а в Object Pascal - self), который эта функция неявно модифицирует.

Ортогональность детерминированности и побочных эффектов

Обычно, функции обладающие побочными эффектами не являются детерминированными, поэтому функции без побочных эффектов, детерминированные функции и чистые функции иногда путают. В действительности это разные свойства функций. Например, функция rand, которая возвращает случайное число, не является детерминированной, хотя она и не обладает побочными эффектами, а гипотетическая функция print, выводящая текст на экран, и всегда возвращающая 0, наоборот — является детерминированной, но обладает побочным эффектом (вывод текста на экран). Ни одна из них не является чистой.

Дополнительная информация