stringtranslate.com

Чистая функция

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

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

Некоторые авторы, особенно из сообщества императивных языков , используют термин «чистый» для всех функций, которые обладают указанным выше свойством 2 [3] [4] (обсуждается ниже).

Примеры

Чистые функции

Следующие примеры функций C++ являются чистыми:

Нечистые функции

Следующие функции C++ являются нечистыми, поскольку им не хватает указанного выше свойства 1:

Следующие функции C++ являются нечистыми, поскольку им не хватает указанного выше свойства 2:

Следующие функции C++ являются нечистыми, поскольку в них отсутствуют свойства 1 и 2:

Ввод-вывод в чистых функциях

Ввод-вывод по своей сути нечист: операции ввода подрывают ссылочную прозрачность , а операции вывода создают побочные эффекты. Тем не менее, в некотором смысле функция может выполнять ввод или вывод и при этом оставаться чистой, если последовательность операций на соответствующих устройствах ввода-вывода моделируется явно как аргумент и результат, а операции ввода-вывода принимаются потерпеть неудачу, когда входная последовательность не описывает операции, фактически выполненные с момента начала выполнения программы. [ нужны разъяснения ]

Второй момент гарантирует, что единственная последовательность, которую можно использовать в качестве аргумента, должна меняться при каждом действии ввода-вывода; первый позволяет различным вызовам функции ввода-вывода возвращать разные результаты из-за изменения аргументов последовательности. [5] [6]

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

Мемоизация

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

Мемоизацию можно выполнить, обернув функцию в другую функцию ( функцию-обертку ). [8]

С помощью мемоизации вычислительные усилия, необходимые для вычислений самой функции, могут быть уменьшены за счет накладных расходов на управление кэшем и увеличения требований к памяти.

Оптимизация компилятора

Функции, которые обладают только указанным выше свойством 2, то есть не имеют побочных эффектов, допускают методы оптимизации компилятора, такие как исключение общих подвыражений и оптимизация цикла, аналогичная арифметическим операторам. [9] Примером C++ является lengthметод, возвращающий размер строки, который зависит от содержимого памяти, на которое указывает строка, поэтому отсутствует указанное выше свойство 1. Тем не менее, в однопоточной среде следующий код C++

std :: string s = "Привет, мир!" ; int a [ 10 ] = { 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 }; интервал л = 0 ;                  для ( int я знак равно 0 ; я < 10 ; ++ я ) { л += s . длина () + а [ я ]; }              

можно оптимизировать так, чтобы значение s.length()вычислялось только один раз перед циклом.

Некоторые языки программирования позволяют объявлять чистое свойство функции:

Модульное тестирование

Поскольку чистые функции имеют одинаковые возвращаемые значения для одинаковых аргументов , они хорошо подходят для модульного тестирования .

Смотрите также

Рекомендации

  1. ^ Бартош Милевский (2013). «Основы Хаскеля». Школа Хаскеля . ФП завершено. Архивировано из оригинала 27 октября 2016 г. Проверено 13 июля 2018 г. Вот фундаментальные свойства чистой функции: 1. Функция возвращает один и тот же результат каждый раз, когда ее вызывают с одним и тем же набором аргументов. Другими словами, функция не имеет состояния и не может получить доступ к какому-либо внешнему состоянию. Каждый раз, когда вы его зовете, он ведет себя как новорожденный ребенок с пустой памятью и отсутствием знаний о внешнем мире. 2. Функция не имеет побочных эффектов. Вызов функции один раз — это то же самое, что вызов ее дважды и отбрасывание результата первого вызова.
  2. ^ Брайан Лонсдорф (2015). «В основном адекватное руководство профессора Фрисби по функциональному программированию». Гитхаб . Проверено 20 марта 2020 г. Чистая функция — это функция, которая при одних и тех же входных данных всегда возвращает один и тот же результат и не имеет какого-либо наблюдаемого побочного эффекта.
  3. ^ «Атрибуты общих функций — использование коллекции компиляторов GNU (GCC)» . gcc.gnu.org, Коллекция компиляторов GNU . Фонд свободного программного обеспечения, Inc. Проверено 28 июня 2018 г.
  4. ^ Возможности языка Fortran 95 # Чистые процедуры
  5. ^ Пейтон Джонс, Саймон Л. (2003). Язык Haskell 98 и библиотеки: пересмотренный отчет (PDF) . Кембридж, Соединенное Королевство: Издательство Кембриджского университета. п. 95. ИСБН 0-521 826144. Проверено 17 июля 2014 г.
  6. ^ Ханус, Майкл. «Карри: интегрированный язык функциональной логики» (PDF) . www-ps.informatik.uni-kiel.de . Институт информатики Университета Христиана Альбрехта в Киле. п. 33. Архивировано из оригинала (PDF) 25 июля 2014 года . Проверено 17 июля 2014 г.
  7. ^ assert() прерывается с сообщением об ошибке, если его аргумент ложный; на 32-битной машине значения, выходящие за рамки fact(12), в любом случае не могут быть представлены.
  8. ^ Эли, Р. (2017). Профессиональное функциональное программирование на PHP: стратегии разработки приложений для оптимизации производительности, параллелизма, тестируемости и краткости кода. SpringerLink: Бюхер. Апресс. п. 109. ИСБН 978-1-4842-2958-3. Проверено 4 февраля 2024 г.
  9. ^ «Атрибуты общих функций — использование коллекции компиляторов GNU (GCC)» . gcc.gnu.org, Коллекция компиляторов GNU . Фонд свободного программного обеспечения, Inc. Проверено 28 июня 2018 г.
  10. ^ Чистый атрибут в Фортране
  11. ^ Чистый атрибут на языке D
  12. ^ «Атрибуты общих функций» . Использование коллекции компиляторов GNU (GCC . Дата обращения 22 июля 2021 г. ).
  13. ^ атрибут constexpr в C++