Przejrzałem internet i obecnie mam następującą definicję czystej funkcji (niezależnie od języka programowania):
- Zwracana wartość (jeśli ją ma?) zależy wyłącznie od jej argumentów. —
Mówiąc kolokwialnie, nie czyta z obiektu dostępnego z zewnątrz.[wykreślone, bo błędne] - Nie posiada skutków ubocznych (side effects). —
Mówiąc kolokwialnie, nie pisze do obiektu dostępnego z zewnątrz.[wykreślone, bo być może błędne]
Jednak zastanawia mnie pewna rzecz: z uwagi na punkt nr 1 wszystkie funkcje, które przyjmują argumenty przez referencję, nie będą czyste.
Dedukując, za czystą można uważać jedynie funkcję przyjmującą argumenty przez wartość.
Dobrze myślę?
UPDATE: Przykład w języku JavaScript:
// Funkcja, która moim zdaniem jest czysta według powyższej definicji
// - liczby przekazywane są przez wartość *
function(someNumber) {
return someNumber + 1;
}
// Funkcja, która moim zdaniem nie jest czysta według powyższej definicji
// - obiekty przekazywane są przez referencję *
function(someObject) {
return someObject.someProperty;
}
UPDATE2: * W języku JavaScript funkcje generalnie uznawane są za takie, które przyjmują argumenty przez wartość (np. według tej dokumentacji MDN), ale najpewniej nie o takie rozróżnienie mi chodzi. MDN podaje, że "object references are values". Dlatego też pominąłem to rozróżnienie wyżej.