2012-05-16 18 views

उत्तर

10

करीबी कार्यशील प्रोग्रामिंग के लिए विशिष्ट नहीं है, और अधिभार ऑब्जेक्ट उन्मुख प्रोग्रामिंग के लिए विशिष्ट नहीं है।

"करीइंग" उन कार्यों का उपयोग है जिनके लिए आप शेष तर्कों के कार्य को प्राप्त करने के लिए आवश्यक तर्कों से कम तर्क प्राप्त कर सकते हैं। अर्थात।अगर हमारे पास एक कार्य plus है जो दो पूर्णांक तर्क लेता है और उनका योग देता है, तो हम एकल तर्क 1 से plus पास कर सकते हैं और परिणाम 1 चीजों को जोड़ने के लिए एक फ़ंक्शन है।

Haskellish वाक्य रचना (निकटता से समारोह आवेदन के साथ) में: (कोष्ठकों द्वारा समारोह आवेदन के साथ)

plusOne = plusCurried 1 
three = plusOne 2 
four = plusCurried 2 2 
five = plusUncurried 2 3 

थोड़ा CISH वाक्य रचना में:

plusOne = plusCurried(1) 
three = plusOne(2) 
four = plusCurried(2)(2) 
five = plusUncurried(2, 3) 

आप इन उदाहरणों में से दोनों में देख सकते हैं कि plusCurried केवल 1 तर्क पर आक्रमण किया जाता है, और नतीजा ऐसा कुछ है जो एक चर के लिए बाध्य किया जा सकता है और फिर किसी अन्य तर्क पर लगाया जा सकता है। एक कार्यात्मक-प्रोग्रामिंग अवधारणा के रूप में आप क्रीमिंग के बारे में सोचने का कारण यह है कि यह कार्यात्मक भाषाओं में सबसे अधिक उपयोग देखता है जिसका वाक्यविन्यास निकटता से आवेदन करता है, क्योंकि उस वाक्यविन्यास में बहुत ही प्राकृतिक हो जाता है। plusCurried और plusUncurried के अनुप्रयोगों को four और five को हास्केलिश सिंटैक्स में परिभाषित करने के लिए पूरी तरह से अलग करने के लिए विलय करने के लिए विलय, ताकि आप सभी कार्यों को हमेशा पूरी तरह से घुमा सकते हैं (यानी प्रत्येक कार्य वास्तव में एक तर्क का कार्य हो, केवल उनमें से कुछ ही अन्य कार्यों को वापस करें जिन्हें अधिक तर्कों पर लागू किया जा सकता है)। जबकि संकुचित तर्क सूचियों द्वारा अनुप्रयोग के साथ सिश सिंटैक्स में, four और five की परिभाषा पूरी तरह से अलग दिखती है, इसलिए आपको plusCurried और plusUncurried के बीच अंतर करने की आवश्यकता है। साथ ही, अनिवार्य भाषाएं जो आज की ऑब्जेक्ट उन्मुख भाषाओं (और आज की ऑब्जेक्ट उन्मुख भाषाओं में से कुछ) के कारण हुईं, उनमें चर के कार्यों को बांधने या उन्हें अन्य कार्यों में पारित करने की क्षमता नहीं थी (इसे प्रथम श्रेणी के कार्यों के रूप में जाना जाता है), और उस सुविधा के बिना कुछ भी नहीं है जो आप वास्तव में कर सकते हैं सभी तर्कों पर इसे आमंत्रित करने के अलावा एक करीबी कार्य के साथ, और इसलिए उन्हें रखने में कोई बात नहीं है।

शब्द करीबी शब्द भी कई तर्कों के एक फ़ंक्शन को बदलने की प्रक्रिया को संदर्भित करता है जो एक तर्क लेता है और एक और कार्य देता है (जो एक भी तर्क लेता है, और एक और कार्य वापस कर सकता है ...), और " अनिश्चितता "रिवर्स रूपांतरण करने की प्रक्रिया को संदर्भित कर सकती है।


अधिभार एक पूरी तरह से असंबंधित अवधारणा है। किसी नाम को अधिभारित करने का अर्थ है विभिन्न विशेषताओं (तर्क प्रकार, तर्कों की संख्या, रिटर्न प्रकार इत्यादि) के साथ कई परिभाषाएं देना, और संकलक को हल करना है कि कौन सी परिभाषा उस संदर्भ के नाम से दी गई है जिसमें संदर्भ दिखाई देता है।

इस का एक काफी स्पष्ट उदाहरण है कि हम plus निर्धारित कर सकते हैं पूर्णांकों को जोड़ने के लिए, लेकिन यह भी चल बिन्दु संख्या को जोड़ने के लिए एक ही नाम plus उपयोग करते हैं, और हम संभावित तार, सरणियों, सूची, आदि श्रृंखलाबद्ध के लिए इसका इस्तेमाल कर सकते है, या वैक्टर या मैट्रिस जोड़ने के लिए। इनमें से सभी के पास बहुत अलग कार्यान्वयन हैं जिनके पास भाषा कार्यान्वयन के संबंध में एक-दूसरे के साथ कुछ लेना देना नहीं है, लेकिन हम उन्हें एक ही नाम देने के लिए गए हैं। संकलक यह जानने के लिए ज़िम्मेदार है कि plus stringA stringB स्ट्रिंग plus (और एक स्ट्रिंग लौटाएं) को कॉल करना चाहिए, जबकि plus intX intY को पूर्णांक plus (और एक पूर्णांक लौटाएं) को कॉल करना चाहिए।

फिर, कोई अंतर्निहित कारण नहीं है कि यह अवधारणा एक कार्यात्मक प्रोग्रामिंग अवधारणा के बजाय "ओओ अवधारणा" क्यों है। यह बस हुआ कि यह विकसित रूप से टाइप की गई वस्तु-उन्मुख भाषाओं में काफी स्वाभाविक रूप से फिट हुआ; यदि आप पहले से ही उस ऑब्जेक्ट को कॉल करने के तरीके को हल कर रहे हैं जिस पर विधि लागू की जाती है, तो यह अधिक सामान्य ओवरलोडिंग की अनुमति देने के लिए एक छोटा सा खिंचाव है।पूरी तरह से विज्ञापन-ओवरलोडिंग (जहां आप एक ही नाम को कई बार परिभाषित करने से अधिक कुछ नहीं करते हैं और संकलक को इसे समझने के लिए भरोसा करते हैं) प्रथम श्रेणी के कार्यों वाले भाषाओं में अच्छी तरह से फिट नहीं होता है, क्योंकि जब आप अधिभारित नाम को एक के रूप में पास करते हैं अपने आप को कार्य करें, यह जानने में आपकी मदद करने के लिए कॉलिंग संदर्भ नहीं है कि कौन सी परिभाषा का इरादा है (और प्रोग्रामर भ्रमित हो सकते हैं यदि वे वास्तव में चाहते थे कि सभी ओवरलोडेड परिभाषाएं पास करें)। हास्केल ने ओवरलोडिंग का उपयोग करने के लिए अधिक प्रधानाचार्य तरीके के रूप में प्रकार के वर्ग विकसित किए; इन प्रभावी ढंग से आपको एक बार में सभी अधिभारित परिभाषाओं को पारित करने की अनुमति देता है, और टाइप सिस्टम को कुछ प्रकार के व्यक्त करने की इजाजत देता है जैसे कि "0 प्रकार" जिसके लिए फ़ंक्शन f और g परिभाषित किए गए हैं "।


सारांश में:

  • currying और अधिक भार पूरी तरह से असंबंधित
  • currying कम तर्कों को कार्यों को लागू करने के बारे में है की तुलना में वे आदेश शेष तर्क
  • से अधिक भार के एक समारोह प्राप्त करने के लिए आवश्यकता होती है एक ही नाम के लिए कई परिभाषाएं प्रदान करने के बारे में है और संकलक चुनते हैं कि प्रत्येक बार नाम का उपयोग करने पर प्रत्येक परिभाषा का उपयोग किया जाता है
  • neit उसकी करी और न ही ओवरलोडिंग या तो कार्यात्मक प्रोग्रामिंग या ऑब्जेक्ट उन्मुख प्रोग्रामिंग के लिए विशिष्ट हैं; वे प्रत्येक भाषा को विकसित करने के तरीके के कारण एक या दूसरे की ऐतिहासिक भाषाओं में अधिक व्यापक हो जाते हैं, जिससे उन्हें एक प्रकार की भाषा में अधिक उपयोगी या अधिक स्पष्ट हो जाता है
+0

बहुत अच्छी तरह से समझाया गया, बहुत बहुत धन्यवाद ... मुझे लगता है कि मैं अब समझना शुरू कर रहा हूं। –

11

नहीं (यदि संभव हो तो उदाहरण के साथ), वे पूरी तरह से असंबंधित और भिन्न हैं। अक्सर बहुरूपता (विभिन्न रूपों की) के रूप में कार्यात्मक प्रोग्रामिंग में जाना जाता है -

Overloading एक ही कोड अनुमति देने के लिए एक तकनीक विभिन्न प्रकार पर इस्तेमाल किया जा रहा है।

एक बहुरूपी समारोह:

map :: (a -> b) -> [a] -> [b] 
map f []  = [] 
map f (x:xs) = f x : map f xs 

यहाँ, map एक समारोह है कि किसी भी सूची पर चल रही है। यह polymorphic है - यह हैशटेबल्स के पेड़ों की एक सूची के रूप में Int की एक सूची के साथ ही काम करता है। यह उच्च-आदेश है, यह एक ऐसा कार्य है जो एक तर्क के रूप में कार्य करता है।

Currying एक फ़ंक्शन का परिवर्तन है जो n तर्कों की संरचना लेता है, प्रत्येक एक तर्क लेने वाले कार्यों की एक श्रृंखला में।

विवादास्पद भाषाओं में, आप किसी भी फ़ंक्शन को अपने कुछ तर्कों पर लागू कर सकते हैं, जो एक समारोह प्रदान करते हैं जो शेष तर्क लेता है। आंशिक रूप से लागू कार्य एक बंद है।

और आप Curry और Schonfinkel द्वारा आविष्कार किए गए परिवर्तन को लागू करके एक अनिवार्य फ़ंक्शन को एक अनिश्चित (और इसके विपरीत) में बदल सकते हैं।

curry :: ((a, b) -> c) -> a -> b -> c 
    -- curry converts an uncurried function to a curried function. 

uncurry :: (a -> b -> c) -> (a, b) -> c 
    -- uncurry converts a curried function to a function on pairs. 
+0

मिमीएम तो आपका मतलब है कि करी और अधिक है किसी विधि के पैरामीटर को हटाने (या बदलने) की तुलना में? मेरा मतलब है अवधारणात्मक –

+4

@ मार्सेलोडएगुइयार यह कहकर उससे अधिक है कि इसमें यह शामिल होगा। यह नहीं है यह पूरी तरह से असंबंधित है - जैसे डॉन ने कहा। – sepp2k

1

अधिभार में एक ही नाम के साथ कई पैरामीटर हैं, जिसमें विभिन्न पैरामीटर हैं।

करीबी वह जगह है जहां आप एकाधिक पैरामीटर ले सकते हैं, और चुनिंदा कुछ सेट कर सकते हैं, इसलिए आपके पास केवल एक चर हो सकता है, उदाहरण के लिए।

तो, यदि आपके पास 3 आयामों में ग्राफ़िंग फ़ंक्शन है, तो आपके पास हो सकता है: justgraphit(double[] x, double[] y, double[] z), और आप इसे ग्राफ़ करना चाहते हैं।

करी से आप कर सकते हैं: var fx = justgraphit(xlist)(y)(z) जहां आपने अब एफएक्स सेट किया है ताकि अब इसमें दो चर हो।

फिर, बाद में, उपयोगकर्ता (तारीख) एक और अक्ष उठाता है और आप y निर्धारित करते हैं, तो अब आपके पास: फिर var fy = fx(ylist)(z)

, बाद में तुम सिर्फ कुछ डेटा और केवल अधिक पाशन द्वारा जानकारी का ग्राफ़ बना भिन्नता z पैरामीटर है।

यह जटिल कार्यों को सरल बनाता है क्योंकि आपको बड़े पैमाने पर सेट चर को पारित करने की आवश्यकता नहीं है, इसलिए पठनीयता बढ़ जाती है।

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