A számítógépes programozásban a tiszta függvény egy olyan függvény, amely a következő tulajdonságokkal rendelkezik:
Visszatérési értéke ugyanaz, ugyanazon argumentum esetén (nincs változás a helyi statikus változókkal, nem lokális változókkal, mutálható referencia argumentumokkal vagy bemeneti folyamokkal az I/O eszközökből). Az értékelésnek nincs mellékhatása (a helyi statikus változók, nem lokális változók, mutálható referencia-argumentumok vagy I/O-folyamok nem mutálódnak).
Így egy tiszta függvény egy matematikai függvény számítási analógja. Egyes szerzők, különösen az imperatív nyelvi közösség, a "tiszta" kifejezést használják minden olyan függvényre, amely csak a fenti tulajdonságokkal rendelkezik.Fortran 95 language features#Pure Procedures
Példák
Tiszta függvények A C++ függvények következő példái tiszták:
floor, egy szám egészrészét adja vissza; max, két érték közül a nagyobbik értékét adja vissza; sin, egy szám szinuszával tér vissza.
Tisztátlan függvények A következő C++ függvények nem tiszták, mivel nem felelnek meg a fenti 1. pontnak:
a nem lokális változó visszatérési értékváltozása miatt
int f() { return x; }
a visszatérő érték változása miatt, amely mutálható referencia argumentummal rendelkezik
int f(int* x) { return *x; }
A következő C++ függvények nem tiszták, mivel nem felelnek meg a fenti 2. pontnak:
a helyi statikus változó mutációja miatt
void f() { static int x = 0; ++x; }
nem lokális változó mutációja miatt
void f() { ++x; }
egy mutálható referencia argumentum mutációja miatt
void f(int* x) { ++*x; }
egy kimeneti áramlat mutációja miatt
void f() { std::cout << "Hello, world!" << std::endl; }
A következő C++ függvények nem tiszták, mivel hiányoznak mind a fenti 1, mind a 2 tulajdonságok:
a visszatérő értékváltozás miatt a helyi statikus változóval és a helyi statikus változó mutációjával
int f() { static int x = 0; ++x; return x; }
a visszatérési érték változása miatt egy bemeneti árammal és egy bemeneti áram mutációjával
int f() { int x = 0; std::cin >> x; return x; }
I/O tiszta funkciókban Az I/O eredetileg tisztázatlan: a bemeneti műveletek aláássák a referencia-átláthatóságot, és a kimeneti műveletek mellékhatásokat hoznak létre. Mindazonáltal van értelme, hogy a függvény képes legyen bemeneti vagy kimeneti feladatok elvégzésére, és még mindig tiszta legyen, ha a vonatkozó I/O-eszközök működésének sorrendje kifejezetten mint argumentum és eredmény, és az I/O műveletekre nem sikerül, ha a bemeneti sorrend nem írja le a program végrehajtása óta ténylegesen végrehajtott műveleteket.
A második pont biztosítja, hogy az egyetlen argumentumként használható szekvencia minden I/O műveletnél megváltozzon; az első lehetővé teszi az I/O-teljesítő funkcióhoz tartozó különböző hívások különböző eredményeinek visszaadását a megváltozott szekvencia argumentumok miatt.
Az I/O monád egy olyan programozási idióma, amelyet tipikusan az I/O végrehajtására használnak tiszta funkcionális nyelveken.
Fordító optimalizálások Azok a funkciók, amelyek csak a fenti 2. pontnak felelnek meg, lehetővé tesznek fordítóoptimalizálási technikákat, mint például az aritmetikai operátorokhoz hasonló közös alexpressziós eltávolítás és hurok optimalizálás. Egy C++ példa a length metódus, amely a karakterlánc nagyságát adja vissza, amely memória tartalmától függ amelyre a karakterláncra mutat, ezért nem felel meg a fenti 1. pontnak. Mindazonáltal egyszálú környezetben az alábbi C++ kód std::string s = "Hello, world!"; int a = {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]; } optimalizálható úgy, hogy az s.length() értékét csak egyszer, a hurok előtt számoljuk ki.
Fortran-ban a pure kulcsszó használható arra, hogy egy függvényt csak mellékhatássá nyilvánítson (azaz csak a fenti tulajdonság 2). A C ++ -ban a constexpr kulcsszó használható arra, hogy egy függvényt a fenti 1-es és 2-es tulajdonságokkal constexpr (azaz tisztán legyen ebben a cikkben használt értelemben); az ilyen funkciók a többszálas környezetben is közös alexpressziós eltávolítási és hurok optimalizálásnak vannak kitéve.
Lásd még
A fordítási időfüggvény végrehajtása : a tiszta funkciók értékelése a fordítási időben Tisztán funkcionális adatszerkezet Referencia-átláthatóság (informatika) Lambda kalkulus Mellékhatás (informatika) Tiszta eljárás Idempotencia tiszta kulcsszó a Fortranban a tiszta függvények megjegyzésével constexpr kulcsszó a C ++ jelzésben a fordítási idő alatt használható tiszta függvényekben
További információk
Pure attribútum Fortran-ban constexpr attribútum C++-ban Tiszta attribútum D nyelven
Kategória:Programozási paradigmák