2011-09-28 13 views
8

होमवर्क असाइनमेंट के लिए, हमें किसी भी "साइड इफेक्ट्स" के बिना एक कार्य पूरा करने का निर्देश दिया गया है। मैंने विकिपीडिया पर "साइड इफेक्ट्स" देखा है, और हालांकि मुझे लगता है कि सिद्धांत में इसका अर्थ है "एक राज्य को संशोधित करता है या कॉलिंग फ़ंक्शंस के साथ एक अवलोकन करने योग्य बातचीत है", मुझे विशिष्टताओं को समझने में परेशानी हो रही है।ओकैमल: कुछ मूल्यों को संग्रहीत करने के बाद बाद में "साइड इफेक्ट्स" पेश किया जाता है?

उदाहरण के लिए, एक गैर-संकलन समय परिणाम रखने वाला मान बनाना साइड इफेक्ट्स पेश कर रहा है?

(वाक्य रचना सही नहीं हो सकता है) कहो मैं था:

val myList = (someFunction x y);; 
if List.exists ((=) 7) myList then true else false;; 

इस परिचय चाहेंगे दुष्प्रभाव? मुझे लगता है कि मैं साइड इफेक्ट्स की परिभाषा में "एक राज्य को संशोधित करता है" पर उलझन में हूं।

+3

शैली के लिए एक संकेत: "अगर अभिव्यक्ति फिर सत्य और गलत" पैटर्न या अन्य समान पैटर्न शुरुआती लोगों के बीच बहुत आम हैं। यदि आप इसके बारे में सोचते हैं, तो यदि भाग को चुना जाना है तो अभिव्यक्ति सच होनी चाहिए और अन्य भाग के लिए इसे गलत होना चाहिए। तो इस पैटर्न को छोड़ दिया जा सकता है और "अभिव्यक्ति" में कम किया जा सकता है। – LiKao

+0

क्या आप इसके लिए कोड दिखा सकते हैं? मैं निश्चित रूप से एक नौसिखिया हूं और कुछ मार्गदर्शन का उपयोग कर सकता हूं। –

+0

निश्चित रूप से, यह काफी सरल है: "अगर List.exists ((=) 7) myList तो सत्य और गलत;;" आप बस "List.exists ((=) 7) myList ;;" लिख सकते हैं। यदि आप कारणों के बारे में सोचने से रोकते हैं, तो इन दो कथनों में समान अर्थशास्त्र क्यों हैं, आप कार्यात्मक (और सामान्य) प्रोग्रामिंग के बारे में बहुत कुछ सीखेंगे। – LiKao

उत्तर

8

नहीं; एक दुष्प्रभाव उदाहरण को संदर्भित करता है असाइनमेंट ऑपरेटर := के साथ ref सेल को म्यूटेट करना, या अन्य चीजें जहां नाम से संदर्भित मान समय के साथ बदलता है। इस मामले में, myList एक अपरिवर्तनीय मूल्य है जो प्रोग्राम के दौरान कभी भी नहीं बदलता है, इस प्रकार यह प्रभाव मुक्त होता है।

भी

http://en.wikipedia.org/wiki/Referential_transparency_(computer_science)

+0

धन्यवाद, यह लिंक बेहतर समझने के लिए कार्यात्मक प्रोग्रामिंग और साइड इफेक्ट्स के लिए बहुत उपयोगी है। –

5

देखें के बारे में यह है सोचने के लिए एक अच्छा तरीका "मैं जो किसी भी बाद में कोड (यह वही समारोह बाद में फिर से चलाने सहित) कुछ भी कभी संभवतः मूल्य मैं के अलावा अन्य देख सकते हैं बदल मैं वापस आ रहा हूँ? " यदि हां, तो यह एक दुष्प्रभाव है। यदि नहीं, तो आप जान सकते हैं कि कोई नहीं है।

तो, कुछ की तरह:

let inc_nosf v = v+1 

कोई साइड इफेक्ट नहीं है यह सिर्फ एक नया मान जो एक पूर्णांक वी एक से अधिक है देता है क्योंकि तो अगर आप ocaml उच्चस्तरीय में निम्न कोड चलाते हैं तो आप मिलता है। संबंधित परिणाम:

# let x = 5;; 
val x : int = 5 
# inc_nosf x;; 
- : int = 6 
# x;; 
- : int = 5 

जैसा कि आप देख सकते हैं, एक्स का मान नहीं बदला। इसलिए, चूंकि हमने वापसी मूल्य को नहीं बचाया है, तब कुछ भी वास्तव में वृद्धि नहीं हुई है। हमारा कार्य केवल रिटर्न वैल्यू को संशोधित करता है, न कि एक्स स्वयं।

# let x = inc_nosf x;; 
val x : int = 6 
# x;; 
- : int = 6 

के बाद से inc_nosf समारोह कोई साइड इफेक्ट (जो है, यह केवल अपनी वापसी मान का उपयोग कर बाहर की दुनिया के साथ संचार, किसी भी अन्य बनाकर नहीं है: तो यह एक्स में बचाने के लिए, हम कर दिया था परिवर्तन)।

लेकिन कुछ की तरह:

let inc_sf r = r := !r+1 

क्योंकि यह संदर्भ आर के प्रतिनिधित्व में संग्रहीत मूल्य में परिवर्तन साइड इफेक्ट है। तो अगर आप शीर्ष स्तर में समान कोड चलाने के लिए, तो आप इस मिलता है, बजाय:

# let y = ref 5;; 
val y : int ref = {contents = 5} 
# inc_sf y;; 
- : unit =() 
# y;; 
- : int ref = {contents = 6} 

इसलिए, इस मामले में, भले ही हम अभी भी वापसी मान नहीं बचा है, यह वैसे भी वृद्धि हो गई। इसका मतलब है कि वापसी मूल्य के अलावा किसी अन्य चीज़ में बदलाव होना चाहिए। इस मामले में, यह परिवर्तन := का उपयोग करके असाइनमेंट था जो रेफरी के संग्रहीत मूल्य को बदल देता था।

अंगूठे के अच्छे नियम के रूप में, ओकंपल में, यदि आप रेफरी, रिकॉर्ड, कक्षाएं, तार, सरणी और हैश टेबल का उपयोग करने से बचते हैं, तो आप दुष्प्रभावों के किसी भी जोखिम से बचेंगे। यद्यपि आप स्ट्रिंग अक्षर का सुरक्षित रूप से उपयोग कर सकते हैं जब तक कि आप String.set या String.fill जैसे फ़ंक्शंस का उपयोग करके स्ट्रिंग को संशोधित करने से बचें। असल में, कोई भी फ़ंक्शन जो डेटा प्रकार को संशोधित कर सकता है, वह दुष्प्रभाव का कारण बनता है।

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