"सामान्य" तरीका, जो एक शुद्ध कार्य है, को फिर से दर्ज करने का तरीका संदर्भात्मक पारदर्शिता के संदर्भ में है । एक फ़ंक्शन शुद्ध है यदि यह संदर्भात्मक रूप से पारदर्शी है ।
प्रासंगिक ट्रांसपेरेंसी , मोटे तौर पर, का अर्थ है कि आप प्रोग्राम के अर्थ को बदले बिना, प्रोग्राम के किसी भी बिंदु पर कॉल को इसके रिटर्न मान या इसके विपरीत से बदल सकते हैं।
इसलिए, उदाहरण के लिए, यदि C printf
संदर्भित रूप से पारदर्शी थे , तो इन दो कार्यक्रमों का एक ही अर्थ होना चाहिए:
printf("Hello");
तथा
5;
और निम्नलिखित सभी कार्यक्रमों का एक ही अर्थ होना चाहिए:
5 + 5;
printf("Hello") + 5;
printf("Hello") + printf("Hello");
क्योंकि printf
लिखे गए वर्णों की संख्या, इस मामले में 5।
यह void
कार्यों के साथ और भी स्पष्ट हो जाता है । यदि मेरे पास कोई फ़ंक्शन है void foo
, तो
foo(bar, baz, quux);
जैसा होना चाहिए वैसा ही होना चाहिए
;
यानी चूंकि foo
रिटर्न कुछ भी नहीं है, मुझे कार्यक्रम का अर्थ बदले बिना इसे कुछ भी नहीं बदलने में सक्षम होना चाहिए।
यह स्पष्ट है, तो, कि न तो printf
है और न ही foo
referentially पारदर्शी होते हैं, और इस तरह उनमें से कोई भी शुद्ध कर रहे हैं। वास्तव में, एक void
फ़ंक्शन कभी भी प्रासंगिक रूप से पारदर्शी नहीं हो सकता है, जब तक कि यह एक नो-ऑप न हो।
मुझे यह परिभाषा बहुत आसान लगती है जैसे आपने दी थी। यह आपको अपने इच्छित किसी भी ग्रैन्युलैरिटी पर इसे लागू करने की भी अनुमति देता है: आप इसे व्यक्तिगत अभिव्यक्तियों से लेकर, फ़ंक्शंस तक, पूरे कार्यक्रमों में लागू कर सकते हैं। यह आपको एक उदाहरण के बारे में बात करने की अनुमति देता है:
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)
हम उन अभिव्यक्तियों का विश्लेषण कर सकते हैं जो फ़ंक्शन बनाते हैं और आसानी से यह निष्कर्ष निकालते हैं कि वे संदर्भित रूप से पारदर्शी नहीं हैं और इस तरह शुद्ध नहीं हैं, क्योंकि वे एक उत्परिवर्ती डेटा संरचना का उपयोग करते हैं, अर्थात् memo
सरणी। हालांकि, हम भी समारोह में देख सकते हैं और देख सकते हैं कि यह है referentially पारदर्शी है और इस तरह शुद्ध। इसे कभी-कभी बाहरी शुद्धता भी कहा जाता है , जो कि एक ऐसा कार्य है जो बाहरी दुनिया के लिए शुद्ध है, लेकिन इसे आंतरिक रूप से अशुद्ध माना जाता है।
इस तरह के कार्य अभी भी उपयोगी हैं, क्योंकि जब अशुद्धता इसके चारों ओर सब कुछ संक्रमित करती है, तो बाहरी शुद्ध इंटरफ़ेस एक प्रकार का "शुद्धता अवरोध" बनाता है, जहां अशुद्धता केवल फ़ंक्शन की तीन पंक्तियों को संक्रमित करती है, लेकिन बाकी कार्यक्रम में लीक नहीं होती है । पूरे कार्यक्रम की तुलना में शुद्धता के लिए विश्लेषण करने के लिए ये तीन लाइनें बहुत आसान हैं।