2016-11-28 7 views
14

तो, मैं एक अनुभवी ओओपी प्रोग्रामर (मुख्य रूप से सी ++) हूं, अभी कार्यात्मक प्रोग्रामिंग के साथ अपने पैर की उंगलियों को डुबोना शुरू कर रहा हूं। मेरी समझ से, पूरी तरह से कार्यात्मक प्रतिमान में, कार्यों में सशर्त नहीं होना चाहिए और जितना संभव हो उतना टूटना चाहिए। क्या कोई मुझे निम्नलिखित उदाहरण का "शुद्ध" कार्यात्मक संस्करण प्रदान कर सकता है?शुद्ध रूप से कार्यात्मक प्रोग्रामिंग

let rec greatestCommonFactor a b = 
    if a = 0 then b 
    elif a < b then greatestCommonFactor a (b - a) 
    else greatestCommonFactor (a - b) b 
+2

स्टैक ओवरफ़्लो में आपका स्वागत है! और प्रश्न पूछने से पहले [सहायता केंद्र] (http://stackoverflow.com/help) को स्पष्ट रूप से पढ़ने पर बधाई: यह एक उत्कृष्ट पहला सवाल था। सटीक, संक्षेप में, आवश्यक विवरणों के साथ और बाहरी शब्दकोष के गुच्छा के बिना। अगर मैं कर सकता तो मैं आपके प्रश्न को 5 बार बढ़ा दूंगा। बहुत बढ़िया! – rmunn

उत्तर

16

उदाहरण समारोह है कि आप की आपूर्ति की है पहले से ही पूरी तरह कार्यात्मक है: अधिमानतः हर सख्त तकनीक है कि कार्यात्मक प्रतिमान का हिस्सा होगा का उपयोग कर। जब हम एक फ़ंक्शन शुद्धता के बारे में बात करते हैं, तो हम वास्तव में किस बारे में बात कर रहे हैं वह 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 
+2

तो सशर्त कोई फर्क नहीं पड़ता? मैं इस धारणा के तहत था कि कार्यात्मक प्रतिमान में सशर्तों को समाप्त करना पसंद किया गया था। जैसे कि उनके स्थान पर लैम्ब्डा का उपयोग करना। – Zach

+4

@Zach कुछ कार्यात्मक भाषाएं terse शैलियों की ओर रुख करती हैं, लेकिन सशर्त अभी भी मौजूद हैं। यहां तक ​​कि हास्केल में 'if' कीवर्ड भी है, हालांकि, F # की तरह, आप 'if' और' then' से अधिक मिलान पैटर्न का उपयोग करना चाहते हैं। –

+5

@ ज़च नोप, सशर्त बिल्कुल कोई फर्क नहीं पड़ता। अक्सर कार्यात्मक प्रोग्रामिंग में सशर्त को 'if/elif/else' अभिव्यक्तियों के बजाय पैटर्न मिलान के माध्यम से संभाला जाता है लेकिन यदि आपने यहां प्रस्तुत किया है, तो यह पूरी तरह स्टाइलिस्ट है। – TheInnerLight

संबंधित मुद्दे