Ocaml

2012-05-08 14 views
5

में ओवरलोडिंग मुझे पता है कि ओकैमल अधिभार का समर्थन नहीं करता है। फिर, अधिभार के बजाय, हम इसे काम करने के लिए क्या कर सकते हैं?Ocaml

1) इसके बजाय बहुरूपता का उपयोग करें? 2) विभिन्न कार्यों को अलग-अलग नाम दें? 3) एक ही नाम के कार्यों को विभिन्न मॉड्यूल में डाल दें?

कौन सा काम करेगा?

उत्तर

13

यह सब ओवरलोडिंग से आपका क्या मतलब है इस पर निर्भर करता है। कई उपयोग मामले हैं, जैसे:

यदि आप गणितीय अभिव्यक्ति में सामान्य इन्फिक्स ऑपरेटरों का नाम पूर्णांक से कुछ और जोड़ना चाहते हैं: स्थानीय रूप से अपने ऑपरेटरों को दोबारा जोड़ दें; मॉड्यूल और "स्थानीय खुले" इसके साथ मदद कर सकते हैं।

module I32 = struct 
    open Int32 
    let (+), (-), (*), (/), (!!) = add, sub, mul, div, of_int 
end 

... I32.(x + y * !!2) ... 

आप एक ऑपरेशन सांख्यिक प्रकार के प्रकार इस्तेमाल किया जा रहा में बहुरूपी होना चाहते हैं, तो आप इस तरह के संख्यात्मक ऑपरेटरों से अधिक सार की जरूरत है। उदाहरण के सामान्य तेजी से घातांक समारोह (एक पूर्णांक द्वारा) के लिए, कि क्या आप का एक सेट के रूप में पर "अधिभार" करना चाहते हैं पर कब्जा करने के मैट्रिक्स आदि

let rec pow (*) one a = function 
    | 0 -> one 
    | n -> pow (*) (if n mod 2 = 0 then one else one * a) (a * a) (n/2) 

let() = assert (pow (*.) 1. 2. 3 = 8.) 

अधिक आम तौर पर, हाँ, विचार है पर इस्तेमाल किया जा सकता ऑपरेटर (यहां इन्फिक्स ऑपरेटर हैं लेकिन सादा नाम ठीक हैं और पठनीयता के लिए अक्सर बेहतर होते हैं), और उन परिचालनों के शब्दकोशों के आस-पास और सार को पार करते हैं - वास्तव में हास्केल प्रकार के वर्गों को संकलित करने की तरह ही।

+0

मुझे लगता है कि आपने मॉड्यूल I32 में 'ओपन इंट 32' किया था, तो क्या होगा यदि आपने वहां 'Int32 शामिल' किया था तो क्या होगा? क्या वे अनिवार्य रूप से उस संदर्भ में समकक्ष हैं? – aneccodeal

+1

@aneccodeal: यह बहुत अलग होगा: यदि मैंने 'शामिल' का उपयोग किया है, तो 'I32' में सभी' Int32' शामिल होंगे, इसलिए स्थानीय रूप से 'I32' खोलना विशेष रूप से' Int32' की सभी परिभाषाओं को आयात करेगा। मैं बड़े स्कोप्स को 'ओपन' नहीं करना पसंद करता क्योंकि यह उपयोगकर्ता परिभाषाओं को छायांकित करने का जोखिम उठाता है। – gasche