उदाहरण समारोह है कि आप की आपूर्ति की है पहले से ही पूरी तरह कार्यात्मक है: अधिमानतः हर सख्त तकनीक है कि कार्यात्मक प्रतिमान का हिस्सा होगा का उपयोग कर। जब हम एक फ़ंक्शन शुद्धता के बारे में बात करते हैं, तो हम वास्तव में किस बारे में बात कर रहे हैं वह referentially transparent कार्यों की संपत्ति है।
एक अभिव्यक्ति संदर्भित रूप से पारदर्शी है यदि इसे प्रोग्राम के प्रभाव को बदलने के बिना इसके मूल्य के साथ प्रतिस्थापित किया जा सकता है। एक साधारण उदाहरण देने के लिए, समारोह की कल्पना:
let add2 x = x + 2
अब, कहीं भी है कि मूल्य add2 2
हमारे कार्यक्रम में दिखाई देता है, हम मूल्य 4
कार्यक्रम के व्यवहार को बदले बिना स्थानापन्न कर सकते हैं।
अब कल्पना कीजिए कि हम समारोह है कि कंसोल के लिए प्रिंट में कुछ अतिरिक्त व्यवहार जोड़ें:
let add2Print x =
printfn "%d" x
x + 2
समारोह का परिणाम है, पहले की तरह ही है हम अब मान के साथ मूल्य प्रतिस्थापन प्रदर्शन कर सकते हैं हमारे प्रोग्राम के व्यवहार को बदले बिना 4
क्योंकि हमारे फ़ंक्शन में कंसोल पर प्रिंटिंग का अतिरिक्त दुष्प्रभाव है।
यह फ़ंक्शन अब संदर्भित पारदर्शी नहीं है और इसलिए शुद्ध कार्य नहीं है।
let rec greatestCommonFactor a b =
if a = 0 then b
elif a < b then greatestCommonFactor a (b - a)
else greatestCommonFactor (a - b) b
इस समारोह है कि आप की आपूर्ति की है को देखते हुए, कोई साइड इफेक्ट इसके निष्पादन में शामिल हैं। हम हमेशा दिए गए इनपुट a
और b
के लिए एक ही आउटपुट मान प्राप्त करेंगे, इसलिए यह पहले से ही एक शुद्ध कार्य है।
स्पष्ट होने के लिए, कार्यात्मक प्रोग्रामिंग में सशर्त वाले कार्यों के साथ बिल्कुल कोई समस्या नहीं है। अक्सर, हम if/elif/else
अभिव्यक्तियों के बजाय पैटर्न मिलान का उपयोग करते हैं लेकिन उदाहरण में आपने वर्णन किया है, यह पूरी तरह से स्टाइलिस्ट है। पैटर्न मिलान का उपयोग करके आपके फ़ंक्शन की एक वैकल्पिक अभिव्यक्ति होगी:
let rec greatestCommonFactor a b =
match a with
|0 -> b
|a' when a' < b -> greatestCommonFactor a' (b - a')
|a' -> greatestCommonFactor (a' - b) b
स्टैक ओवरफ़्लो में आपका स्वागत है! और प्रश्न पूछने से पहले [सहायता केंद्र] (http://stackoverflow.com/help) को स्पष्ट रूप से पढ़ने पर बधाई: यह एक उत्कृष्ट पहला सवाल था। सटीक, संक्षेप में, आवश्यक विवरणों के साथ और बाहरी शब्दकोष के गुच्छा के बिना। अगर मैं कर सकता तो मैं आपके प्रश्न को 5 बार बढ़ा दूंगा। बहुत बढ़िया! – rmunn