एफ # में एक सामान्य समारोह कॉल कोष्ठकों के बिना लिखा है और मानकों रिक्तियों से अलग कर रहे हैं। कई मापदंडों के एक समारोह को परिभाषित करने का आसान तरीका यह लिखना है:
let add a b = a + b
के रूप में पास्कल बताया गया है, को निर्दिष्ट मापदंडों का इस तरह से currying कहा जाता है - विचार एक समारोह सिर्फ एक पैरामीटर लेता है कि है और परिणाम है एक ऐसा फ़ंक्शन जो दूसरा पैरामीटर लेता है और वास्तविक परिणाम (या कोई अन्य फ़ंक्शन) देता है। इस तरह के एक साधारण समारोह को कॉल करते समय, आप add 10 5
लिखेंगे और संकलक (सिद्धांत रूप में) इसे ((add 10) 5)
के रूप में व्याख्या करता है। यह कुछ अच्छा लाभ है - उदाहरण के लिए यह आप का उपयोग करने की अनुमति देता आंशिक समारोह आवेदन जहाँ आप एक समारोह का केवल एक पहले कुछ तर्क निर्दिष्ट करें:
let addTen = add 10 // declares function that adds 10 to any argument
addTen 5 // returns 15
addTen 9 // returns 19
जब सूचियों प्रसंस्करण यह सुविधा उदाहरण के लिए व्यावहारिक रूप से उपयोगी है:
// The code using explicit lambda functions..
[ 1 .. 10 ] |> List.map (fun x -> add 10 x)
// Can be rewritten using partial function application:
[ 1 .. 10 ] |> List.map (add 10)
अब, भ्रमित भाग में जाएं - एफ # में, आप टुपल्स के साथ भी काम कर सकते हैं, जो कि सरल डेटा प्रकार हैं जो आपको कई मानों को एक ही मान में समूहित करने की अनुमति देते हैं (ध्यान दें कि टुपल्स फ़ंक्शंस से संबंधित नहीं हैं किसी भी प्रकार)।उदाहरण के लिए आप लिख सकते हैं:
// The following function:
let add (a, b) = a * b
// ...means exactly the same thing as:
let add tup =
let (a, b) = tup // extract elements of a tuple
a * b
// You can call the function by creating tuple inline:
add (10, 5)
// .. or by creating tuple in advance
let t = (10, 5)
add t
:
let tup = (10, "ten") // creating a tuple
let (n, s) = tup // extracting elements of a tuple using pattern
printfn "n=%d s=%s" n s // prints "n=10 s=ten"
यदि आप एक समारोह है कि एक अल्पविराम के द्वारा अलग कोष्ठक में पैरामीटर लेता है लिखते हैं, आप वास्तव में एक समारोह है कि एक एकल पैरामीटर जो एक टपल है लेता लिख रहे हैं
यह एक अलग प्रकार का एक कार्य है - यह एक एकल पैरामीटर लेता है जो एक ट्यूपल होता है, जबकि पहला संस्करण एक ऐसा फ़ंक्शन था जिसमें दो पैरामीटर (करी का उपयोग करके) लिया गया था।
एफ # में, स्थिति उससे थोड़ा अधिक जटिल है - .NET विधियों को पैरामीटर के रूप में एक ट्यूपल लेने के तरीकों के रूप में दिखाई देता है (ताकि आप उन्हें कोष्ठक नोटेशन के साथ कॉल कर सकें), लेकिन वे कुछ सीमित हैं (उदाहरण के लिए आप पहले एक टुपल नहीं बना सकते हैं और फिर विधि को बस टुपल दे सकते हैं)। साथ ही, संकलित एफ # कोड वास्तव में करीबी रूप में विधियों का उत्पादन नहीं करता है (इसलिए आप सीधे सी # से आंशिक फ़ंक्शन एप्लिकेशन का उपयोग नहीं कर सकते हैं)। यह प्रदर्शन कारणों से है - ज्यादातर बार, आप सभी तर्क निर्दिष्ट करते हैं और इसे अधिक कुशलतापूर्वक कार्यान्वित किया जा सकता है।
हालांकि, सिद्धांत यह है कि एक फ़ंक्शन या तो एकाधिक पैरामीटर लेता है या पैरामीटर के रूप में एक ट्यूपल लेता है।
ग्रेट उत्तर, लेकिन ध्यान दें कि आपका दूसरा-से-अंतिम पैराग्राफ बिल्कुल सही नहीं है - एक गैर-सिंटैक्टिक ट्यूपल को .NET विधि में पास करना पूरी तरह से संभव है (उदाहरण के लिए 'ऑब्जेक्ट में टी = 1,2 ऑब्जेक्ट। ReeferenceEquals t') । यह अधिभारित तरीकों के लिए काम नहीं करता है, हालांकि। – kvb
@kvb: अच्छा बिंदु - मुझे पता था कि कुछ सीमाएं थीं, लेकिन मुझे बिल्कुल यकीन नहीं था। स्पष्टीकरण के लिए धन्यवाद। –
बहुत बढ़िया! इस तरह के जवाब स्टैक ओवरव्लो को इतनी मूल्यवान जगह बनाते हैं। धन्यवाद थॉमस। – Daniel