Saf bir fonksiyonun ne olduğunu ifade etmenin "normal" yolu , referans şeffaflığı ile ilgilidir . Referans olarak şeffafsa bir işlev saftır .
Referans Şeffaflığı , kabaca, programın anlamını değiştirmeden programın herhangi bir noktasında fonksiyon çağrısını dönüş değeriyle değiştirebileceğiniz anlamına gelir.
Dolayısıyla, örneğin, eğer printf
C'ler referans olarak şeffafsa, bu iki programın aynı anlama sahip olması gerekir:
printf("Hello");
ve
5;
ve aşağıdaki programların tümü aynı anlama sahip olmalıdır:
5 + 5;
printf("Hello") + 5;
printf("Hello") + printf("Hello");
Çünkü printf
yazılan karakter sayısını döndürür, bu durumda 5.
void
İşlevlerle daha da belirginleşir . Bir işlevim varsa void foo
, o zaman
foo(bar, baz, quux);
ile aynı olmalı
;
Yani foo
hiçbir şey döndürmediği için, programın anlamını değiştirmeden onu hiçbir şeyle değiştirebilmeliyim.
Öyleyse açıktır ki, ne referans olarak şeffaf ne printf
de foo
şeffaftır ve dolayısıyla ikisi de saf değildir. Aslında bir void
işlev, işlemsiz olmadığı sürece, hiçbir zaman referans olarak şeffaf olamaz.
Bu tanımı verdiğiniz tanım olarak daha kolay ele alıyorum. Ayrıca, istediğiniz herhangi bir ayrıntı düzeyinde uygulamanıza olanak tanır: bunu tek tek ifadelere, işlevlere ve tüm programlara uygulayabilirsiniz. Örneğin, böyle bir işlev hakkında konuşmanıza olanak tanır:
func fib(n):
return memo[n] if memo.has_key?(n)
return 1 if n <= 1
return memo[n] = fib(n-1) + fib(n-2)
Fonksiyonu oluşturan ifadeleri analiz edebilir ve değiştirilebilir bir veri yapısı, yani memo
dizi kullandıkları için, referans olarak şeffaf olmadıkları ve dolayısıyla saf olmadıkları sonucuna kolayca varabiliriz . Ancak, biz de işlevi bakabilirsiniz ve bu görebilirsiniz olduğu referentially şeffaf ve böylece saf. Bu bazen dış saflık olarak adlandırılır , yani dış dünyaya saf görünen ancak dahili olarak saf olmayan bir işlevdir.
Bu tür işlevler hala kullanışlıdır, çünkü kirlilik etrafındaki her şeye bulaşsa da, dış saf arayüz bir tür "saflık engeli" oluşturur, burada kirlilik işlevin yalnızca üç satırını etkiler, ancak programın geri kalanına sızmaz. . Bu üç satırın doğruluğu tüm programdan çok daha kolaydır.