2013-07-26 13 views

उत्तर

11

का जवाब दे क्या () है इससे पहले कि कुछ मूल बातें परिभाषित और कुछ उदाहरण करवाने की सुविधा देता है।

एफ # एक let statement में एक नाम, शून्य या अधिक तर्क, और एक अभिव्यक्ति है।

इस सरल को रखने के लिए हम साथ जाएंगे:
यदि कोई तर्क नहीं है तो लेट स्टेटमेंट value है।
तर्क देखते हैं तो देना बयान एक function है।

एक मूल्य के लिए, अभिव्यक्ति का परिणाम केवल एक बार मूल्यांकन किया है और पहचानकर्ता के लिए बाध्य है; यह अपरिवर्तनीय है।
एक समारोह के लिए, अभिव्यक्ति हर बार समारोह में कहा जाता है मूल्यांकन किया जाता है।

तो यह मूल्य

let a = System.DateTime.Now;; 

हमेशा समय जब वह पहली बार

a;; 
val it : System.DateTime = 1/10/2017 8:16:16 AM ... 
a;; 
val it : System.DateTime = 1/10/2017 8:16:16 AM ... 
a;; 
val it : System.DateTime = 1/10/2017 8:16:16 AM ... 

मूल्यांकन किया जाता है या बाद में लागू किया, यानी और इस समारोह होगा

let b() = System.DateTime.Now;; 

अलवा होगा वाईएस एक नया समय हर बार यह मूल्यांकन किया जाता है, अर्थात

b();; 
val it : System.DateTime = 1/10/2017 8:18:41 AM ... 
b();; 
val it : System.DateTime = 1/10/2017 8:18:49 AM ... 
b();; 
val it : System.DateTime = 1/10/2017 8:20:32 AM ... 

अब क्या () साधन की व्याख्या करने के लिए है। ध्यान दें कि System.DateTime.Now को काम करने के लिए कोई तर्क की आवश्यकता नहीं है।

अभिव्यक्ति की कोई आवश्यकता नहीं होने पर हम फ़ंक्शन कैसे बना सकते हैं?

हर तर्क एक प्रकार है करने के लिए है, तो एफ # कार्यों कि इकाई प्रकार के लिए कोई तर्क और केवल मूल्य की जरूरत है () है के लिए unit type है।

तो इस प्रकार के int

let c x = x + 1;; 

में से एक तर्क x साथ एक समारोह है और इस प्रकार के unit

let b() = System.DateTime.Now;; 
+0

बस शब्दों में कहें, क्या यह पैरामीटर के बिना एफ फंक्शन का एफ # फॉर्म है? – Fabricio

+1

@ फ़ैब्रिकियो हां। लेकिन मैंने टिप्पणी के लिए 15 वर्णों को कम करने के लिए कुछ जोड़ा है। –

+0

@ फ़ैब्रिकियो: मैं यह नहीं कहूंगा। 'बी' यहां एक फ़ंक्शन है जो * एक * पैरामीटर लेता है:' unit'। यदि आप इसे कोष्ठक के बिना कॉल करने का प्रयास करते हैं, तो आपको 'b' फ़ंक्शन के * परिणाम * की बजाय * फ़ंक्शन मान *' b' मिलता है। कोशिश करें 'चलो डी = बी ;; डी(); 'एफएसआई में। –

4

() का उपयोग एक ऐसा फ़ंक्शन बनाता है जो दूसरे मामले की तुलना में unit का एक पैरामीटर लेता है जो कि केवल एक साधारण पूर्णांक है।

यह विशेष रूप से महत्वपूर्ण है जब आप फ़ंक्शन के निष्पादन को नियंत्रित करना चाहते हैं।

मुख्य अंतर यह है कि जब आप

let name() = 
    printfn "hello" 
    1 

है बनाम

let name = 
    printfn "hello" 
    1 

तो

let t = name + name 

एक बार प्रिंट होगा "हैलो" है। लेकिन

let t = (name()) + (name()) 

दो बार "हैलो" प्रिंट करेगा।

फ़ंक्शन का मूल्यांकन करने वाले आदेश पर विचार करते समय आपको इसके साथ सावधान रहना होगा।

let intversion = 
    printfn "creating integer constant" 
    1 

printfn "integer created" 

let funcversion() = 
    printfn "executing function" 
    1 

printfn "function created" 

let a = intversion + intversion 
printfn "integer calculation done" 
let b = (funcversion()) + (funcveriosn()) 
printfn "function calculation done" 

इस क्रम में निम्नलिखित

  1. पूर्णांक लगातार
  2. पूर्णांक बनाने बनाया
  3. समारोह
  4. पूर्णांक गणना किया बनाया
  5. प्रिंट होगा:

    निम्नलिखित कार्यक्रम पर विचार करें

  6. क्रियान्वित समारोह
  7. क्रियान्वित समारोह
  8. समारोह गणना
+0

मुझे लगता है कि मैं और अधिक उदाहरण की जरूरत में से एक तर्क () साथ एक समारोह है। यह बहुत स्पष्ट नहीं है कि यह अभी तक इतना महत्वपूर्ण क्यों है। वैसे भी, वह '; 1' के लिए क्या है? – Fabricio

+0

मैं कुछ और उदाहरण जोड़ूंगा। '; 1' हमें एक नई लाइन के बराबर और फिर 1) ताकि वापसी मूल्य हो। मैंने इसे ब्रेवटी –

+0

के लिए रखा है, मुझे यह नहीं मिला कि "पूर्णांक निरंतर बनाना" क्यों मुद्रित किया गया है यदि इसे अभी परिभाषित किया गया है। – Fabricio

8

किया

let name() = 3 
name() 

name में एक समारोह है, प्रकार unit -> int की।

let name = 3 
name 

name में प्रकार int की, एक पूर्णांक है।

एफ # में, प्रत्येक फ़ंक्शन में इनपुट प्रकार और आउटपुट प्रकार होता है। let name() = 3 का इनपुट प्रकार unit है, जिसमें केवल एक मान () है।इसका आउटपुट प्रकार int है, जिसमें –2,147,483,648 से 2,147,483,647 के मान हैं। एक और उदाहरण के रूप में bool में केवल दो मान हैं, true और false

तो आपसे सवाल है कि () का उपयोग क्या है। यदि आप फ़ंक्शन के इनपुट मान निर्दिष्ट नहीं करते हैं, तो इसे निष्पादित नहीं किया जा सकता है। तो आपको इसे निष्पादित करने के लिए अपने फ़ंक्शन let name()=3 पर इनपुट मान निर्दिष्ट करना होगा और इसके इनपुट प्रकार की वजह से unit है, केवल एक ही मान जिसका उपयोग आप कर सकते हैं () है।

let name : (unit -> int) = (fun _ -> 3);; 

और को यह तुलना:

let name : int = 3 
+0

पर साइड इफेक्ट्स हो सकता है, धन्यवाद! यह अपवर्त आपको 10k प्रतिनिधि देता है। :) – Vache

10

निश्चित रूप से नहीं एक समारोह कॉल या ऐसा कुछ के लिए कुछ वाक्य रचना के रूप में () क्या समझते हो

यहाँ एक और तरीका नाम समारोह को परिभाषित करने के लिए है । यह सिर्फ एक मूल्य है, जैसे 3, 5, 'क्यू', झूठा, या "ब्लाह"। यह Unit प्रकार का मान होता है, और वास्तव में यह केवल प्रकार इकाई का मान है, लेकिन वास्तव में यह बिंदु के बगल में है। () यहां है एक मूल्य। मैं इतना तनाव नहीं कर सकता।

सबसे पहले विचार करना

let name x = 3 

यह क्या है? यह सिर्फ एक्स पर एक फ़ंक्शन को परिभाषित करता है, जहां x किसी भी प्रकार का हो सकता है। सी # में होगा:

int Name<T>(T x) 
{ 
    return 3; 
} 

अब अगर हम let name() = 3 को देखो (और मैं कुछ हद तक, वहाँ है कि अतिरिक्त रिक्ति डाल सलाह देते हैं तो यह बनाता है () कुछ वाक्यात्मक संरचना की तुलना में अधिक एक मूल्य देखने के लिए) तो सी # में आप सोच सकते हैं यह (स्यूडोकोड)

int Name<T>(T x) where T == Unit //since "()" is the only possible value of Unit 
{ 
    return 3; 
} 

की तरह कुछ के रूप में या, और अधिक बस

int Name(Unit x) 
{ 
    return 3; 
} 

तो हम देखते हैं कि सब let name() = 3, है वायुसेना की परिभाषा एकीकरण जो Unit तर्क लेता है, और उपरोक्त सी # संस्करण की तरह 3 लौटाता है।

हालांकि अगर हम let name = 3 पर देखते हैं तो यह केवल एक चर परिभाषा है, जैसे var name = 3 सी # में।

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