जब आप let x = 3
लिखते हैं, आप मूल्य 3
को पहचानकर्ता x
बाध्यकारी हैं। यदि आप एक ही समय में दूसरी बार ऐसा करते हैं, तो आप एक नया पहचानकर्ता घोषित कर रहे हैं जो पिछले एक को छुपाता है क्योंकि उसका नाम समान है।
एफ # में एक मान को म्यूट करना विनाशकारी अद्यतन ऑपरेटर, <-
के माध्यम से किया जाता है। यह अपरिवर्तनीय मूल्यों के लिए असफल हो जायेगी, यानी .:
> let x = 3;;
val x : int = 3
> x <- 5;;
x <- 5;;
^^^^^^
stdin(2,1): error FS0027: This value is not mutable
एक परिवर्तनशील चर घोषित करने के लिए, mutable
जोड़ने let
के बाद:
let mutable x = 5;;
val mutable x : int = 5
> x <- 6;;
val it : unit =()
> x;;
val it : int = 6
लेकिन क्या दोनों के बीच अंतर, आप पूछ सकते हैं है? एक उदाहरण पर्याप्त हो सकता है:
let i = 0;
while i < 10 do
let i = i + 1
()
उपस्थिति के बावजूद, यह एक अनंत लूप है। लूप के अंदर घोषित i
एक अलग i
है जो बाहरी को छुपाता है। बाहरी एक अपरिवर्तनीय है, इसलिए यह हमेशा अपना मान 0
रखता है और लूप कभी समाप्त नहीं होता है। इस लिखने के लिए सही तरीका एक परिवर्तनशील चर के साथ है:
let mutable i = 0;
while i < 10 do
i <- i + 1
()
संभावित डुप्लिकेट http://stackoverflow.com/questions/2844047/what-is-the-let-keyword-in-functional-languages: FSI गतिशील कोड है कि आपके उदाहरण में निम्नलिखित की तरह कुछ लग रहा है का उत्सर्जन करता है -like-एफ-एंड-ओकंपल-के लिए।उत्तर वहां परिवर्तनीय बाध्यकारी और परिवर्तनीय असाइनमेंट के बीच भेद की व्याख्या करते हैं। – Heatsink
@Alex: आपको [इस प्रश्न] के उत्तर मिल सकते हैं (http://stackoverflow.com/questions/2478079/f-shadowing-and-nested-function) सहायक। – Daniel
प्रश्न समान है लेकिन यह एक डुप्लिकेट नहीं है। –