देखें के बारे में यह है सोचने के लिए एक अच्छा तरीका "मैं जो किसी भी बाद में कोड (यह वही समारोह बाद में फिर से चलाने सहित) कुछ भी कभी संभवतः मूल्य मैं के अलावा अन्य देख सकते हैं बदल मैं वापस आ रहा हूँ? " यदि हां, तो यह एक दुष्प्रभाव है। यदि नहीं, तो आप जान सकते हैं कि कोई नहीं है।
तो, कुछ की तरह:
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 जैसे फ़ंक्शंस का उपयोग करके स्ट्रिंग को संशोधित करने से बचें। असल में, कोई भी फ़ंक्शन जो डेटा प्रकार को संशोधित कर सकता है, वह दुष्प्रभाव का कारण बनता है।
शैली के लिए एक संकेत: "अगर अभिव्यक्ति फिर सत्य और गलत" पैटर्न या अन्य समान पैटर्न शुरुआती लोगों के बीच बहुत आम हैं। यदि आप इसके बारे में सोचते हैं, तो यदि भाग को चुना जाना है तो अभिव्यक्ति सच होनी चाहिए और अन्य भाग के लिए इसे गलत होना चाहिए। तो इस पैटर्न को छोड़ दिया जा सकता है और "अभिव्यक्ति" में कम किया जा सकता है। – LiKao
क्या आप इसके लिए कोड दिखा सकते हैं? मैं निश्चित रूप से एक नौसिखिया हूं और कुछ मार्गदर्शन का उपयोग कर सकता हूं। –
निश्चित रूप से, यह काफी सरल है: "अगर List.exists ((=) 7) myList तो सत्य और गलत;;" आप बस "List.exists ((=) 7) myList ;;" लिख सकते हैं। यदि आप कारणों के बारे में सोचने से रोकते हैं, तो इन दो कथनों में समान अर्थशास्त्र क्यों हैं, आप कार्यात्मक (और सामान्य) प्रोग्रामिंग के बारे में बहुत कुछ सीखेंगे। – LiKao