2011-10-27 12 views
5

में परिभाषित किया गया था यह ठीक काम क्यों करता है?मॉड्यूल के बाहर खुले यूनियनों का उपयोग करके उन्हें

module Account = struct 

type account_type = Current of float | Savings of float 

end 

let sarah = Account.Current 100.0;; 

जबकि निम्नलिखित में अंतिम पंक्ति Error: syntax error उत्पन्न करती है?

module Account = struct 

    type 'a account_type = [> `Current of float | `Savings of float ] as 'a 

end 

let pete = Account.`Current 100.0;; 

यही है, मैं मॉड्यूल खोलने के बिना मॉड्यूल के बाहर ओपन यूनियन प्रकार का उपयोग क्यों नहीं कर सकता? मैं कहना चाहिए मुझे पता चला है कि करने के लिए अंतिम पंक्ति को बदलने:

open Account;; 
let pete = `Current 100.0;; 

ठीक काम करता है, लेकिन स्पष्ट रूप से यह बोझिल है अगर मैं account_type एक बहुत का उपयोग करें, या वैकल्पिक रूप से मैं किसी भी कोड के शुरू में Account खोलने के लिए है अनुभाग जहां account_type का उपयोग किया जाता है, जिसका अर्थ है कि मैं Account
के लिए हस्ताक्षर का उपयोग करके प्राप्त करने वाले अमूर्तता को त्याग दूंगा, मैंने कई ओकैम ट्यूटोरियल्स के साथ-साथ INRIA दस्तावेज़ों के माध्यम से ट्रैवल किया है, और मुझे कोई उल्लेख नहीं मिल रहा है आप यह कैसे करते हैं
क्या हर बार मॉड्यूल खोलने से बचना संभव है जब मैं account_type का उपयोग करना चाहता हूं?

अग्रिम धन्यवाद,

ज़ैक

उत्तर

6

दूसरे उदाहरण में, आप वास्तव में open Account की जरूरत नहीं है सब पर, वाक्य रचना सिर्फ `Current 100.0 है। एक पॉलिमॉर्फिक संस्करण टैग किसी विशेष प्रकार में भाग नहीं लेता है। `Current का प्रकार [> `Current ] है, यह (>) का अर्थ है कि प्रकार कम से कम `Current है, और चूंकि यह फ़ंक्शन द्वारा स्वीकार किए गए प्रकार का सबसेट है, यह ठीक से संकलित होगा। आप वही मान पास कर सकते हैं जो एक ही नाम के बहुरूप संस्करण को स्वीकार करते हैं। बेशक, स्थिर प्रकार की जानकारी की कमी है, और टाइपिंग त्रुटियां और परिस्थितियां काफी जटिल हो सकती हैं।

Code Reuse through polymorphic variants कुछ फायदों के बारे में बात करता है और उनके लिए मामलों का उपयोग करता है।

5

`Current जैसे पॉलिमॉर्फिक संस्करण स्थिरांक विश्व स्तर पर परिभाषित हैं, समान रूप से पूर्णांक स्थिरांक के लिए। Account मॉड्यूल के अंदर पूर्णांक 10 को संदर्भित करने के लिए आप Account.10 नहीं कहेंगे।

यह पॉलिमॉर्फिक रूपों की ताकत (और कमजोरी) है, आप उन्हें परिभाषित किए बिना उनका उपयोग कर सकते हैं (जैसे कि इसे उपयोग करने से पहले 10 को परिभाषित करने की आवश्यकता नहीं है)।

तो, जैसा कि nlucaroni कहते हैं, आपको `Current तक पहुंच प्राप्त करने के लिए Account मॉड्यूल खोलने की आवश्यकता नहीं है।

पूर्णांक के विपरीत, पॉलिमॉर्फिक वेरिएंट पैरामीटर भी ले सकते हैं (जैसा कि आपके `Current 100.0 में)। लेकिन पैरामीटर और उनके प्रकार की संख्या तय नहीं की गई है, और वे कोड में विभिन्न स्थानों में एक ही निर्माता के लिए भी भिन्न हो सकते हैं। इसलिए nlucaroni द्वारा भी जटिलताओं का उल्लेख किया।

[स्वरूपण नोट: टाइपराइटर-स्टाइल टेक्स्ट में दिखाने के लिए एकल बैकक्वॉट ` प्राप्त करने के लिए, मार्कडाउन सम्मेलन टेक्स्ट को संलग्न करने के लिए दोगुनी बैकक्वॉट्स का उपयोग करना है। यह पाठ के अंदर अकेले एकल बैकक्वॉट छोड़ देता है। या कम से कम यह मेरे लिए काम कर रहा है।]

+0

आह, मैंने बैकटिक से बैकटिक से बचने की कोशिश की, इस प्रकार इसमें शामिल सभी के लिए भ्रम पैदा हुआ। – nlucaroni

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