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 printfC'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ü printfyazı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 foohiç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 printfde fooşeffaftır ve dolayısıyla ikisi de saf değildir. Aslında bir voidiş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 memodizi 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.