У програмування, чиста функція — це функція, яка має такі властивості:
- повернені значення з функції тотожні для тотожних аргументів (ніяких змін разом з локальними статичними змінними, нелокальними змінними, мутовними аргументами-посиланями або (потоками введення/виведення)), і
- функція не має побічних впливів (не змінює локальні статичні змінні, нелокальні змінні, змінні аргументи-посилання або потоки введення/виведення).
Отже, чиста функція це обчислювальний аналог математичної функції. Деякі автори, особливо зі спільноти імперативних мов, використовують термін «чиста» для всіх функцій, що мають лише другу зі щойно наведених властивостей (обговорено нижче).
Приклад
Чисті функції
Наступні приклади функцій з чисті:
floor
, повертає цілу частину числа;max
, повертає більше з двох значень.- функція f, визначена як Значення
void f() { static std::atomic<unsigned int> x = 0; ++x; }
x
можна спостерігати всередині викликівf()
і через те, щоf()
не повідомляє значенняx
назовні, вона невідрізненна від функціїvoid f() {}
, яка нічого не робить. Зауважте, щоx
цеstd::atomic
, тому зміни з багатьох потоків, що виконуютьf()
конкурентно не спричиняють стан гонитви, який призводить до невизначеної поведінки в C і C++.
Нечисті функції
Наступні функції C++ нечисті, бо їм бракує властивості 1:
- бо повертане значення змінюється зі зміною статичної змінної
int f() { static int x = 0; ++x; return x; }
- бо повертане значення змінюється зі зміною нелокальної змінної З тої ж причини, наприклад, бібліотечна функція C++
int f() { return x; }
sin()
не чиста, бо її наслідок залежить від режиму заокруглення IEEE, який можна змінити під час виконання. - бо повертане значення змінюється зі зміною мутовного аргумента-посилання
int f(int* x) { return *x; }
- бо повертане значення залежить від стану потоку введення
int f() { int x = 0; std::cin >> x; return x; }
Наступні функції в C++ нечисті, бо вони не мають властивості 2:
- через зміну локальної статичної змінної
void f() { static int x = 0; ++x; }
- через зміну нелокальної змінної
void f() { ++x; }
- через зміну мутовного аргумента-посилання
void f(int* x) { ++*x; }
- через зміну потоку виведення
void f() { std::cout << "Hello, world!" << std::endl; }
Наступні функції в C++ нечисті, бо вони не мають обох властивостей:
- бо повертане значення змінюється разом з локальною статичною змінною і через зміну локальної статичної змінної
int f() { static int x = 0; ++x; return x; }
- бо повертане значення змінюється залежно від стану потоку введення і сам потік введення зазнає змін
int f() { int x = 0; std::cin >> x; return x; }
Оптимізації компілятора
Функції, що мають лише другу властивість дозволяють такі компіляторні техніки оптимізації як усунення спільних підвиразів і оптимізація циклів. Приклад на C++ це метод length
, що повертає розмір рядка, що залежить від вмісту пам'яті, на яку вказує змінна, що порушує властивість 1. Проте, в однопотоковому середовищі, наступний код на C++
std::string s = "Hello, world!"; int a[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; int l = 0; for (int i = 0; i < 10; ++i) { l += s.length() + a[i]; }
можна оптимізувати так, що значення s.length()
обчислене лише раз, перед циклом.
Примітки
- Bartosz Milewski (2013). . School of Haskell. FP Complete. Архів оригіналу за 27 жовтня 2016. Процитовано 13 липня 2018.
Ось засадничі властивості чистих функцій: 1. Функція повертає той самий результат на кожен виклик з тим самим набором аргументів. Інакше кажучи, функція не має стану і не має доступу до зовнішнього стану. Кожного разу коли її викликають вона поводиться як новонароджене дитятко без спогадів і без знань про навколишній світ. 2. Функція не має побічних ефектів. Виклик функції один раз це те саме, що викликати її двічі і відкинути результат першого виклику.
- Brian Lonsdorf (2015). Professor Frisby's Mostly Adequate Guide to Functional Programming. GitHub. Процитовано 20 березня 2020.
Чиста функція це функція, яка маючи той самий вхід, завжди повертає те саме значення і не має жодних спостережних побічних впливів.
- GCC 8.1 Manual. GCC, the GNU Compiler Collection. Free Software Foundation, Inc. 2018. Процитовано 28 червня 2018.
Вікіпедія, Українська, Україна, книга, книги, бібліотека, стаття, читати, завантажити, безкоштовно, безкоштовно завантажити, mp3, відео, mp4, 3gp, jpg, jpeg, gif, png, малюнок, музика, пісня, фільм, книга, гра, ігри, мобільний, телефон, android, ios, apple, мобільний телефон, samsung, iphone, xiomi, xiaomi, redmi, honor, oppo, nokia, sonya, mi, ПК, web, Інтернет
U programuvannya chista funkciya ce funkciya yaka maye taki vlastivosti poverneni znachennya z funkciyi totozhni dlya totozhnih argumentiv niyakih zmin razom z lokalnimi statichnimi zminnimi nelokalnimi zminnimi mutovnimi argumentami posilanyami abo potokami vvedennya vivedennya i funkciya ne maye pobichnih vpliviv ne zminyuye lokalni statichni zminni nelokalni zminni zminni argumenti posilannya abo potoki vvedennya vivedennya Otzhe chista funkciya ce obchislyuvalnij analog matematichnoyi funkciyi Deyaki avtori osoblivo zi spilnoti imperativnih mov vikoristovuyut termin chista dlya vsih funkcij sho mayut lishe drugu zi shojno navedenih vlastivostej obgovoreno nizhche PrikladChisti funkciyi Nastupni prikladi funkcij z C chisti floor povertaye cilu chastinu chisla max povertaye bilshe z dvoh znachen funkciya f viznachena yak void f static std atomic lt unsigned int gt x 0 x Znachennya x mozhna sposterigati vseredini viklikiv f i cherez te sho f ne povidomlyaye znachennya x nazovni vona nevidriznenna vid funkciyi void f yaka nichogo ne robit Zauvazhte sho x ce std atomic tomu zmini z bagatoh potokiv sho vikonuyut f konkurentno ne sprichinyayut stan gonitvi yakij prizvodit do neviznachenoyi povedinki v C i C Nechisti funkciyi Nastupni funkciyi C nechisti bo yim brakuye vlastivosti 1 bo povertane znachennya zminyuyetsya zi zminoyu statichnoyi zminnoyi int f static int x 0 x return x bo povertane znachennya zminyuyetsya zi zminoyu nelokalnoyi zminnoyi int f return x Z toyi zh prichini napriklad bibliotechna funkciya C sin ne chista bo yiyi naslidok zalezhit vid rezhimu zaokruglennya IEEE yakij mozhna zminiti pid chas vikonannya bo povertane znachennya zminyuyetsya zi zminoyu mutovnogo argumenta posilannya int f int x return x bo povertane znachennya zalezhit vid stanu potoku vvedennya int f int x 0 std cin gt gt x return x Nastupni funkciyi v C nechisti bo voni ne mayut vlastivosti 2 cherez zminu lokalnoyi statichnoyi zminnoyi void f static int x 0 x cherez zminu nelokalnoyi zminnoyi void f x cherez zminu mutovnogo argumenta posilannya void f int x x cherez zminu potoku vivedennya void f std cout lt lt Hello world lt lt std endl Nastupni funkciyi v C nechisti bo voni ne mayut oboh vlastivostej bo povertane znachennya zminyuyetsya razom z lokalnoyu statichnoyu zminnoyu i cherez zminu lokalnoyi statichnoyi zminnoyi int f static int x 0 x return x bo povertane znachennya zminyuyetsya zalezhno vid stanu potoku vvedennya i sam potik vvedennya zaznaye zmin int f int x 0 std cin gt gt x return x Optimizaciyi kompilyatoraFunkciyi sho mayut lishe drugu vlastivist dozvolyayut taki kompilyatorni tehniki optimizaciyi yak usunennya spilnih pidviraziv i optimizaciya cikliv Priklad na C ce metod length sho povertaye rozmir ryadka sho zalezhit vid vmistu pam yati na yaku vkazuye zminna sho porushuye vlastivist 1 Prote v odnopotokovomu seredovishi nastupnij kod na C std string s Hello world int a 10 1 2 3 4 5 6 7 8 9 10 int l 0 for int i 0 i lt 10 i l s length a i mozhna optimizuvati tak sho znachennya s length obchislene lishe raz pered ciklom PrimitkiBartosz Milewski 2013 School of Haskell FP Complete Arhiv originalu za 27 zhovtnya 2016 Procitovano 13 lipnya 2018 Os zasadnichi vlastivosti chistih funkcij 1 Funkciya povertaye toj samij rezultat na kozhen viklik z tim samim naborom argumentiv Inakshe kazhuchi funkciya ne maye stanu i ne maye dostupu do zovnishnogo stanu Kozhnogo razu koli yiyi viklikayut vona povoditsya yak novonarodzhene dityatko bez spogadiv i bez znan pro navkolishnij svit 2 Funkciya ne maye pobichnih efektiv Viklik funkciyi odin raz ce te same sho viklikati yiyi dvichi i vidkinuti rezultat pershogo vikliku Brian Lonsdorf 2015 Professor Frisby s Mostly Adequate Guide to Functional Programming GitHub Procitovano 20 bereznya 2020 Chista funkciya ce funkciya yaka mayuchi toj samij vhid zavzhdi povertaye te same znachennya i ne maye zhodnih sposterezhnih pobichnih vpliviv GCC 8 1 Manual GCC the GNU Compiler Collection Free Software Foundation Inc 2018 Procitovano 28 chervnya 2018