2013-03-09 3 views
14

मैं ओकंपल की मानक लाइब्रेरी ब्राउज़ कर रहा था, और map.ml फ़ाइल में इस कोड में आया था।इस प्रकार से पहले एक प्लस साइन क्यों है?

module type S = 
    sig 
    type key 
    type +'a t 
    val empty: 'a t' 

मैं सोच रहा हूँ क्यों type +'a t है, और क्यों लेखक उसका उपयोग केवल 'a t की।
इसका व्यवहार अजीब है और मैं इसका उपयोग कम नहीं कर सकता।

# type +'a t = 'a list;; 
type 'a t = 'a list 
# type +'a t = +'a list;; 
Characters 13-14: 
    type +'a t = +'a list;; 
      ^
Error: Syntax error 

धन्यवाद

+0

जेन स्ट्रीट से संबंधित पोस्ट: https://blogs.janestreet.com/a-and-a/ –

उत्तर

14

जेफरी के जवाब पर निर्माण करने के लिए, कारण डेवलपर्स यहाँ covariant के रूप में सार प्रकार अंकन का काम किया है की संभावना नहीं है मदद से आप subtyping उपयोग (अनिवार्य रूप से कोई भी नहीं OCaml में subtyping का उपयोग करता है, पैरामीट्रिक polymorphis आम तौर पर पसंद किया जाता है के रूप में), लेकिन "आराम मूल्य प्रतिबंध" नामक प्रकार प्रणाली के एक कम-से-कम ज्ञात पहलू का उपयोग करने के लिए धन्यवाद, जिसके लिए कॉन्वर्सेंट सार प्रकार अधिक बहुरूपता की अनुमति देते हैं।

आप उन सबटालेटियों को सुरक्षित रूप से अनदेखा कर सकते हैं, किसी दिन, आप एक अमूर्त प्रकार के साथ एक समस्या को दबाते हैं जो कि आप जितना चाहें पॉलिमॉर्फिक नहीं है, और फिर आपको हस्ताक्षर में एक कॉन्वर्सियन एनोटेशन की तुलना में याद रखना चाहिए।

हम इस on reddit/ocaml कुछ महीने पहले चर्चा की:

निम्नलिखित कोड उदाहरण पर विचार करें:

module type S = sig 
    type 'a collection 
    val empty : unit -> 'a collection 
end 

module C : S = struct 
    type 'a collection = 
    | Nil 
    | Cons of 'a * 'a collection 
    let empty() = Nil 
end 

let test = C.empty() 

प्रकार आप test के लिए मिलता है '_a C.collection है, 'a C.collection कि आप उम्मीद करेंगे के बजाय। यह एक बहुलक प्रकार नहीं है ('_a एक मोनोमोर्फिक अनुमान चर है जो अभी तक पूरी तरह से निर्धारित नहीं है), और आप ज्यादातर मामलों में इससे खुश नहीं होंगे।

ऐसा इसलिए है क्योंकि C.empty() एक मूल्य नहीं है, इसलिए इसका प्रकार सामान्यीकृत नहीं है (~ पॉलिमॉर्फिक बनाया गया है)।

module type S = sig 
    type +'a collection 
    val empty : unit -> 'a collection 
end 

बेशक यह केवल इसलिए होता है क्योंकि मॉड्यूल C हस्ताक्षर S के साथ बंद किया गया है:: module C : S = ... आराम मूल्य प्रतिबंध से लाभ के लिए, आपको सार प्रकार 'a collection covariant चिह्नित करने के लिए की है। यदि मॉड्यूल C को स्पष्ट हस्ताक्षर नहीं दिया गया था, तो टाइप-सिस्टम सबसे सामान्य भिन्नता (यहां कॉन्वर्सिस) का अनुमान लगाएगा और कोई उसे नोटिस नहीं करेगा।

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

आप सिद्धांत को समझने के लिए चाहते हैं, तो मूल्य प्रतिबंध और इसकी छूट जैक्स Garrigue, जिसका पहले कुछ पेज विषय और मुख्य विचार करने के लिए एक नहीं बल्कि दिलचस्प और सुलभ परिचय कर रहे हैं से 2004 अनुसंधान लेख Relaxing the value restriction में चर्चा कर रहे हैं।

+0

आपके विस्तृत स्पष्टीकरण के लिए धन्यवाद। मैं map.ml पर वापस आया और निम्न पंक्ति पाई: टाइप करें 'एक टी = खाली | 'ए टी * कुंजी *' ए * 'एक टी * int का नोड जो आपके उदाहरणों की तरह बहुत अधिक है। हालांकि, क्या आप monomorphic अनुमान प्रकार के बारे में अधिक समझा सकते हैं? ऐसा लगता है कि '_a C.collection अभी भी एक C.collection से मेल खाता है। यदि cempty() का प्रकार सामान्यीकृत नहीं है, तो यह कब और किस समस्या का कारण होगा? – octref

+2

@octref: फ़ंक्शन का उपयोग करने का प्रयास करें 'let id = (fun x -> x) (मजेदार x -> x)', जिसमें टाइप ''_a ->' _a' है (क्योंकि इसकी परिभाषा एक अनुप्रयोग है मान, और इसके प्रकार चर दोनों सकारात्मक और नकारात्मक स्थिति में होता है)। आप जल्दी से समस्या को देखेंगे: आप इसे दो अलग-अलग प्रकारों में उपयोग नहीं कर सकते हैं, इसलिए यह पॉलिमॉर्फिक नहीं है। – gasche

+0

धन्यवाद गैस, यह वास्तव में जानना अच्छा है। मैंने कल्पना की कि यह केवल साधारण पुराने उपप्रकार के बारे में था (जिसे मैं लगभग कभी नहीं उपयोग करता, अब आप इसका जिक्र करते हैं)। –

12

इस मॉड्यूल प्रकार के संबंध में covariant के रूप में प्रकार के निशान। मान लें कि आपके पास दो मानचित्र हैं जिनकी चाबियाँ एक ही प्रकार हैं। यह + कहता है कि यदि एक मानचित्र ए के मान अन्य मानचित्र बी के मानों के उप-प्रकार के हैं, तो नक्शा ए का समग्र प्रकार मानचित्र बी का प्रकार का उप प्रकार है। मुझे Jane Street blog में इसका एक बहुत अच्छा विवरण मिला।

+0

यदि मानचित्र ए मानचित्र बी का प्रकार का उप प्रकार है, तो इसका मतलब है कि मैं विधि का उपयोग करने में सक्षम होगा ए पर बी? क्या यह जावा में उपclass धारणा जैसा दिखता है? – octref

+1

ओकैमल का गैर-ओओ भाग जावा जैसा दिखता नहीं है। जावा सबक्लासिंग * एक प्रकार का उप प्रकार है, लेकिन (मुझे विश्वास है कि यहां गैसच) उप-प्रकार का उपयोग ओकैमल में दुर्लभ है जबकि उपclassing जावा की एक प्रमुख विशेषता है। ध्यान दें कि ओकैमल उप-प्रकार का अनुमान नहीं लगाता है। आपको एक सुपरर्ट टाइप में अभिव्यक्ति के प्रकार को स्पष्ट रूप से समन्वयित करने की आवश्यकता है। यह ठीक है क्योंकि यह लगभग कभी नहीं आता है। हालांकि, जब आप ऐसा करते हैं, तो हाँ, यह सबटाइप पर लागू होने के लिए सुपरटेप (केवल विधियों, सभी कार्यों) के लिए परिभाषित कार्यों की अनुमति देता है। –

+0

आपकी व्याख्या के लिए धन्यवाद! – octref

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