2012-02-20 17 views
29

मैंने देखा है कि, OCaml प्रोग्रामर के बीच मुझे पता है, उनमें से कुछ हमेशा उपयोग बहुरूपी वेरिएंट (वेरिएंट कि घोषित नहीं कर रहे हैं, एक backquote उपसर्ग के साथ) है, जबकि अन्य लोगों को कभी नहीं उपयोग बहुरूपी विविधताएँ और वेरिएंट प्रकार में घोषित पसंद करते हैं ।वेरिएंट या पॉलिमॉर्फिक वेरिएंट?

प्रदर्शन कारणों के अलावा (पॉलिमॉर्फिक रूपों को वर्तमान में सरल रूपों से कम कुशलता से संकलित किया गया है), विशेषज्ञ ओकैमल डेवलपर्स उनके बीच कैसे चयन करते हैं?

+1

मुझे लगता है कि पसंदीदा नाम अब "ओपन वेरिएंट" है। – ygrek

+3

"ओपन वेरिएंट" आसानी से "पॉलिमॉर्फिक संस्करण" –

+0

को समझने के लिए स्पष्ट रूप से आसान है, मुझे लगता है कि "ओपन वेरिएंट" अधिक सटीक रूप से 'exn' जैसे प्रकारों को संदर्भित करता है। –

उत्तर

35

मेरा उपयोग निम्नलिखित 5 श्रेणियों में विभाजित किया जा सकता है। 1. इंटरफ़ेस 2. प्रतिरूपकता 3. स्पष्टता 4. संक्षिप्तता 5. चाल

  1. तो संस्करण प्रकार केवल मॉड्यूल के लिए आंतरिक है, मैं नियमित वेरिएंट का उपयोग करें, क्योंकि जैसा कि आप ने कहा कि वे और अधिक कुशलता से संकलित कर रहे हैं।
  2. यदि संस्करण प्रकार इंटरफ़ेस में निर्यात किया जाता है और मुझे लगता है कि कुछ मामलों में अन्य मॉड्यूल में दिखाई दे सकता है लेकिन मॉड्यूल पर निर्भर करने के लिए यह आवश्यक नहीं होगा, मैं पॉलिमॉर्फिक रूपों का उपयोग करता हूं क्योंकि वे बंधे नहीं हैं मॉड्यूल नेमस्पेस सिस्टम। उदाहरण: encoding typeXmlm का प्रकार। signal type को एक वैरिएंट प्रकार के रूप में भी मतलब है कि आप Xmlm पर निर्भरता पेश किए बिना एक्सएमएल प्रोसेसिंग के लिए एक ही विचार का उपयोग करके मॉड्यूल विकसित कर सकते हैं।
  3. यदि इंटरफ़ेस में भिन्न प्रकार का निर्यात किया जाता है तो मुझे कभी-कभी नियमित रूप से वर्बोज़ का उपयोग करने के लिए मिलता है जब संस्करण प्रकार के मान मॉड्यूल के कार्यों को दिए जाते हैं। उदाहरण: version typeUuidm का। Uuidm.create Uuidm.V4 लिखने के बजाय आप बस Uuidm.create `V4 लिख सकते हैं, जो स्पष्ट और कम वर्बोज़ है।
  4. कभी-कभी कोई विशेष कार्य विभिन्न मामलों को वापस कर सकता है। यदि इन मामलों का उपयोग केवल इस फ़ंक्शन द्वारा किया जाता है, तो मैं एक प्रकार की परिभाषा को पेश किए बिना इंटरफ़ेस में फ़ंक्शन प्रकार घोषित करता हूं। उदाहरण के लिए parse : string -> [`Error of string | `Ok of t]
  5. पॉलिमॉर्फिक वेरिएंट और उनके उप प्रकार से आप प्रेत प्रकारों के साथ स्थैतिक रूप से इनवेरिएंट को लागू करने की अनुमति देते हैं। इन्हें परिभाषित करने की संभावना के अलावा, दोनों आविष्कारों को स्थिर रूप से और दस्तावेज़ीकरण उद्देश्यों के लिए लागू करने के लिए उपयोगी हो सकते हैं।

अंततः मैं कभी-कभी 4 के अनुसार मॉड्यूल के कार्यान्वयन में पॉलीमोर्फिक रूपों का उपयोग करता हूं लेकिन उनके बिना इंटरफ़ेस में दिखाई देता है। मैं इस उपयोग को तब तक हतोत्साहित करता हूं जब तक कि आप पॉलीमोर्फिक रूपों को घोषित न करें और उन्हें बंद करें क्योंकि यह स्थिर टाइपिंग अनुशासन को कमजोर करता है।

+1

ग्रेट सारांश। यह कुछ एफएक्यू में होना चाहिए। – ygrek

+2

यह है: http://stackoverflow.com/tags/ocaml/info –

11

अधिकांश मॉड्यूल इंटरफेस में पॉलीमोर्फिक रूपों का उपयोग करने का एकमात्र कारण क्लासिक रूपों के नामकरण मुद्दों के आसपास काम करना है।

हैं निम्नलिखित काम कर सकता था, बहुरूपी वेरिएंट अब मामलों के बहुमत में उपयोगी होगा:

 
type t1 = String of string | Int of int | Bool of bool | List of t1 list 
type t2 = String of string | Int of int | Other 

let simplify x = 
    match (x : t1) with 
     String s -> String s 
    | Int n -> Int n 
    | Bool _ 
    | List _ -> Other 

2014-02-21 अपडेट: उपरोक्त कोड अब OCaml 4.01 में मान्य है। हुर्रे!

+3

उन लोगों के लाभ के लिए जो मेरे बाद पॉलिमॉर्फिक रूपों का उपयोग करने के इस विषय पर पढ़ने के लिए आते हैं: मार्टिन का उदाहरण अंततः ओकैमल 4.01 में कानूनी है। आनन्द! – maverickwoo

+0

@maverickwoo: \ O/ – aneccodeal

11

यह सच नहीं है कि पॉलिमॉर्फिक वेरिएंट हमेशा कम कुशल होते हैं। मार्टिन उदाहरण का उपयोग:

type base = [`String of string | `Int of int] 
type t1 = [base | `Bool of bool | `List of t1 list] 
type t2 = [base | `Other] 

let simplify (x:t1):t2 = match x with 
| #base as b -> b 
| `Bool _ | `List _ -> `Other 

मानक वेरिएंट के साथ इस दो भिन्न प्रकार और एक पूरा recoding की आवश्यकता है, बहुरूपी साथ वेरिएंट आधार मामले शारीरिक रूप से अपरिवर्तनीय है ऐसा करने के लिए।

type leaf = [`String of string | `Int of int] 
type 'b base = [leaf | `List of 'b list] 
type t1 = [t1 base | `Bool of bool ] 
type t2 = [t2 base | `Other] 

let rec simplify (x:t1):t2 = match x with 
| #leaf as x -> x 
| `List t -> `List (List.map simplify t) 
| `Bool _ -> `Other 

और फायदे भी अधिक जब पुनर्लेखन कार्य भी खुला प्रत्यावर्तन के साथ पर निर्भर करता है कर रहे हैं: यह सुविधा वास्तव में जब अवधि नए सिरे से लिखना के लिए खुला प्रत्यावर्तन का उपयोग कर अपने में आता है।

दुर्भाग्यवश ओकंपल की हिंडली-मिलनर प्रकार का अनुमान स्पष्ट टाइपिंग के बिना इस तरह की चीज करने के लिए पर्याप्त मजबूत नहीं है, जिसके लिए प्रकारों की सावधानीपूर्वक कारक की आवश्यकता होती है, जो बदले में प्रोटो-टाइपिंग को मुश्किल बनाता है। इसके अतिरिक्त, स्पष्ट दबाव कभी-कभी आवश्यक होते हैं।

इस तकनीक का बड़ा नकारात्मक पक्ष यह है कि कई मानकों के साथ, जल्द ही एक प्रकार के भ्रमित संयोजन संयोजन के साथ समाप्त होता है, और अंत में स्थिर प्रवर्तन पर छोड़ना और रसोई सिंक प्रकार का उपयोग करना आसान है वाइल्डकार्ड और अपवादों (यानी गतिशील टाइपिंग) के साथ।

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

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