I programmeringssprog er en ren funktion en funktion , der:
At have kun én af egenskaberne er ikke nok til, at en funktion er ren.
Ikke-determinisme af en funktion er en funktions evne til at returnere forskellige værdier på trods af, at de samme værdier af input-argumenterne sendes til den som input. I dette tilfælde er det ikke muligt at konstruere en entydig tabel med funktionsværdier; for sådanne funktioner ser værditabellerne ud som en liste (måske uendelig) over mulige værdier, som funktionen tager på et givet sæt inputparametre.
En funktion er deterministisk, hvis den returnerer det samme resultat for det samme sæt inputværdier.
På imperative sprog kan nogle funktioner i processen med at udføre deres beregninger ændre værdierne af globale variabler, udføre I/O-operationer, reagere på ekstraordinære situationer ved at ringe til deres behandlere. Sådanne funktioner kaldes funktioner med bivirkninger . En anden type bivirkninger er ændringen af de parametre (variabler), der overføres til funktionen, når værdien af inputparameteren også ændres i processen med at beregne funktionens outputværdi.
Næsten ethvert programmeringssprog giver dig mulighed for at beskrive funktioner uden bivirkninger. Men nogle sprog tilskynder eller kræver endda visse former for funktioner for at bruge bivirkninger. For eksempel, i mange objektorienterede sprog sendes en skjult parameter til en klassemedlemsfunktion - en pegepind til den klasseinstans, på vegne af hvilken den tilsvarende funktion kaldes (for eksempel i C ++ kaldes denne parameter dette , og i Object Pascal - self ), som denne funktion implicit modificerer. I C++ kan du dog angive const -modifikatoren på en klassemetode og derved fortælle compileren, at metoden ikke ændrer klassedata.
Normalt er funktioner, der har bivirkninger, ikke deterministiske, så funktioner uden bivirkninger, deterministiske funktioner og rene funktioner forveksles nogle gange. Faktisk er det forskellige egenskaber ved funktioner. For eksempel er rand - funktionen , som returnerer et tilfældigt tal, eller den hypotetiske GetGlobalVarX- funktion , som returnerer værdien af den globale variabel X (og ikke gør andet), ikke deterministiske, selvom de ikke har bivirkninger. Men den hypotetiske funktion print , som viser tekst på skærmen og altid returnerer 0, er tværtimod deterministisk, men har en bivirkning (udskrivning af tekst til skærmen). Ingen af dem er rene.