यह सच नहीं है कि पॉलिमॉर्फिक वेरिएंट हमेशा कम कुशल होते हैं। मार्टिन उदाहरण का उपयोग:
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
और फायदे भी अधिक जब पुनर्लेखन कार्य भी खुला प्रत्यावर्तन के साथ पर निर्भर करता है कर रहे हैं: यह सुविधा वास्तव में जब अवधि नए सिरे से लिखना के लिए खुला प्रत्यावर्तन का उपयोग कर अपने में आता है।
दुर्भाग्यवश ओकंपल की हिंडली-मिलनर प्रकार का अनुमान स्पष्ट टाइपिंग के बिना इस तरह की चीज करने के लिए पर्याप्त मजबूत नहीं है, जिसके लिए प्रकारों की सावधानीपूर्वक कारक की आवश्यकता होती है, जो बदले में प्रोटो-टाइपिंग को मुश्किल बनाता है। इसके अतिरिक्त, स्पष्ट दबाव कभी-कभी आवश्यक होते हैं।
इस तकनीक का बड़ा नकारात्मक पक्ष यह है कि कई मानकों के साथ, जल्द ही एक प्रकार के भ्रमित संयोजन संयोजन के साथ समाप्त होता है, और अंत में स्थिर प्रवर्तन पर छोड़ना और रसोई सिंक प्रकार का उपयोग करना आसान है वाइल्डकार्ड और अपवादों (यानी गतिशील टाइपिंग) के साथ।
मुझे लगता है कि पसंदीदा नाम अब "ओपन वेरिएंट" है। – ygrek
"ओपन वेरिएंट" आसानी से "पॉलिमॉर्फिक संस्करण" –
को समझने के लिए स्पष्ट रूप से आसान है, मुझे लगता है कि "ओपन वेरिएंट" अधिक सटीक रूप से 'exn' जैसे प्रकारों को संदर्भित करता है। –