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