~~~~~~~~~~~~~~~~~~~~ Arc.Ask3.Ru ~~~~~~~~~~~~~~~~~~~~~ 
Номер скриншота №:
✰ 4E02E933BFF81EC379C32BA5F2A100F0__1717007940 ✰
Заголовок документа оригинал.:
✰ Pure function - Wikipedia ✰
Заголовок документа перевод.:
✰ Чистая функция — Википедия ✰
Снимок документа находящегося по адресу (URL):
✰ https://en.wikipedia.org/wiki/Pure_function ✰
Адрес хранения снимка оригинал (URL):
✰ https://arc.ask3.ru/arc/aa/4e/f0/4e02e933bff81ec379c32ba5f2a100f0.html ✰
Адрес хранения снимка перевод (URL):
✰ https://arc.ask3.ru/arc/aa/4e/f0/4e02e933bff81ec379c32ba5f2a100f0__translat.html ✰
Дата и время сохранения документа:
✰ 12.06.2024 04:47:30 (GMT+3, MSK) ✰
Дата и время изменения документа (по данным источника):
✰ 29 May 2024, at 21:39 (UTC). ✰ 

~~~~~~~~~~~~~~~~~~~~~~ Ask3.Ru ~~~~~~~~~~~~~~~~~~~~~~ 
Сервисы Ask3.ru: 
 Архив документов (Снимки документов, в формате HTML, PDF, PNG - подписанные ЭЦП, доказывающие существование документа в момент подписи. Перевод сохраненных документов на русский язык.)https://arc.ask3.ruОтветы на вопросы (Сервис ответов на вопросы, в основном, научной направленности)https://ask3.ru/answer2questionТоварный сопоставитель (Сервис сравнения и выбора товаров) ✰✰
✰ https://ask3.ru/product2collationПартнерыhttps://comrades.ask3.ru


Совет. Чтобы искать на странице, нажмите Ctrl+F или ⌘-F (для MacOS) и введите запрос в поле поиска.
Arc.Ask3.ru: далее начало оригинального документа

Чистая функция — Википедия Jump to content

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

Из Википедии, бесплатной энциклопедии

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

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

Примеры [ править ]

Чистые функции [ править ]

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

  • floor, возвращая пол числа;
  • max, возвращая максимум два значения.
  • функция f , определяемая как
    void   f  ()   { 
       static   std  ::  atomic  <  unsigned   int  >   x   =   0  ; 
        ++  х  ; 
      } 
    
    Значение x можно наблюдать только внутри других вызовов f(), и в качестве f() не сообщает о ценности x для окружающей среды он неотличим от функции void f() {}это ничего не дает. Обратите внимание, что x является std::atomic так что изменения из нескольких потоков, выполняющихся f() одновременно не приводят к гонке данных , которая имеет неопределенное поведение в C и C++.

Нечистые функции [ править ]

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

  • из-за изменения возвращаемого значения со статической переменной
    int   f  ()   { 
       static   int   x   =   0  ; 
        ++  х  ; 
        вернуть   х  ; 
      } 
    
  • из-за изменения возвращаемого значения с нелокальной переменной
    int   f  ()   { 
       return   x  ; 
      } 
    
    По той же причине, например, библиотечная функция C++ sin() не является чистым, поскольку его результат зависит от режима округления IEEE , который можно изменить во время выполнения.
  • из-за изменения возвращаемого значения с изменяемым ссылочным аргументом
    int   f  (  int  *   x  )   { 
       return   *  x  ; 
      } 
    
  • из-за изменения возвращаемого значения в зависимости от входного потока
    int   f  ()   { 
       int   x   знак равно   0  ; 
        станд  ::  cin   >>   x  ; 
        вернуть   х  ; 
      } 
    

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

  • из-за мутации локальной статической переменной
    void   f  ()   { 
       static   int   x   =   0  ; 
        ++  х  ; 
      } 
    
  • из-за мутации нелокальной переменной
    пустота   ж  ()   { 
       ++  х  ; 
      } 
    
  • из-за мутации изменяемого ссылочного аргумента
    пустота   ж  (  int  *   x  )   { 
       +*  x  ; 
      } 
    
  • из-за мутации выходного потока
    void   f  ()   { 
       std  ::  cout   <<   "Привет, мир!"    <<   std  ::  endl  ; 
      } 
    

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

  • из-за изменения возвращаемого значения с помощью локальной статической переменной и мутации локальной статической переменной
    int   f  ()   { 
       static   int   x   =   0  ; 
        ++  х  ; 
        вернуть   х  ; 
      } 
    
  • из-за изменения возвращаемого значения в зависимости от входного потока и мутации входного потока
    int   f  ()   { 
       int   x   знак равно   0  ; 
        станд  ::  cin   >>   x  ; 
        вернуть   х  ; 
      } 
    

Ввод-вывод в чистых функциях [ править ]

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

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

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

Мемоизация [ править ]

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

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

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

Программа C для кэшированного вычисления факториала ( assert()прерывается с сообщением об ошибке, если его аргумент ложный; на 32-битной машине значения выходят за рамки fact(12) все равно не может быть представлено. [ нужна цитата ]

static   int   fact  (  int   n  )   { 
     return   n  <=  1   ?    1   :   факт  (  n  -1  )  *  n  ;  
  } 
 int   fact_wrapper  (  int   n  )   { 
     статический   int   кэш  [  13  ]; 
      утверждать  (  0  <=  n   &&   n  <  13  ); 
      if   (  кэш  [  n  ]   ==   0  ) 
         кеш  [  n  ]   =   факт  (  n  ); 
      вернуть   кеш  [  n  ]; 
  } 

Оптимизация компилятора [ править ]

Функции, которые обладают только указанным выше свойством 2, то есть не имеют побочных эффектов, допускают методы оптимизации компилятора, такие как исключение общих подвыражений и оптимизация цикла, аналогичная арифметическим операторам. [6] Примером 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 г.
  2. ^ Брайан Лонсдорф (2015). «В основном адекватное руководство профессора Фрисби по функциональному программированию» . Гитхаб . Проверено 20 марта 2020 г.
  3. ^ Пейтон Джонс, Саймон Л. (2003). Язык Haskell 98 и библиотеки: пересмотренный отчет (PDF) . Кембридж, Соединенное Королевство: Издательство Кембриджского университета. п. 95. ИСБН  0-521 826144 . Проверено 17 июля 2014 г.
  4. ^ Ханус, Майкл. «Карри: интегрированный язык функциональной логики» (PDF) . www-ps.informatik.uni-kiel.de . Институт компьютерных наук Университета Кристиана Альбрехта в Киле. п. 33. Архивировано из оригинала (PDF) 25 июля 2014 года . Проверено 17 июля 2014 г.
  5. ^ Алей, Р. (2017). Профессиональное функциональное программирование на PHP: стратегии разработки приложений для оптимизации производительности, параллелизма, тестируемости и краткости кода . SpringerLink: Бюхер. Апресс. п. 109. ИСБН  978-1-4842-2958-3 . Проверено 4 февраля 2024 г.
  6. ^ «Атрибуты общих функций — использование коллекции компиляторов GNU (GCC)» . gcc.gnu.org, Коллекция компиляторов GNU . Фонд свободного программного обеспечения, Inc. Проверено 28 июня 2018 г.
  7. ^ Чистый атрибут в Фортране
  8. ^ Чистый атрибут на языке D
  9. ^ «Атрибуты общих функций» . Использование коллекции компиляторов GNU (GCC . Дата обращения 22 июля 2021 г. ) .
  10. ^ атрибут constexpr в C++
Arc.Ask3.Ru: конец оригинального документа.
Arc.Ask3.Ru
Номер скриншота №: 4E02E933BFF81EC379C32BA5F2A100F0__1717007940
URL1:https://en.wikipedia.org/wiki/Pure_function
Заголовок, (Title) документа по адресу, URL1:
Pure function - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть, любые претензии не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, денежную единицу можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)