2015-01-09 4 views
8

मैं OCaml, हम इसे क्यों की जरूरत है और जब इसका इस्तेमाल करने में GADT की अवधारणा के लिए चारों ओर खोज की है, आदिओकैम में जीएडीटी का प्रदर्शन करने के लिए एक ठोस सरल उदाहरण?

मैं समझता हूँ GADT OCaml में लेकिन एक और अधिक सामान्य शब्द न केवल है।

मैं

What are GADTs?

http://caml.inria.fr/pub/docs/manual-ocaml-400/manual021.html#toc85

http://www.reddit.com/r/ocaml/comments/1jmjwf/explain_me_gadts_like_im_5_or_like_im_an/

आदि मिल गया है, लेकिन उनमें से कुछ हास्केल में कर रहे हैं, और दूसरों कोई GADT के बीच एक अच्छा तुलना उदाहरण नहीं है और GADT

तो मैं जो चाहता हूं वह एक सरल लेकिन अच्छा ठोस उदाहरण है जहां मैं देख सकता हूं कि जीएडीटी के बिना, चीजें खराब हैं।

क्या मुझे यह मिल सकता है?

+0

यह प्रकारों पर कड़े बाधाओं की अनुमति देता है। और इसका उदाहरण एक अस्थिर है, जहां कुछ रचनाकारों को बूलियन या पूर्णांक, एट कैटेरा द्वारा पैरामीटर किया जा सकता है। – nlucaroni

+1

ऐसी कोई बुरी स्थिति नहीं है: 4.0 से पहले, ओकॉल को गेट के लिए समर्थन नहीं था, और जहां लोग ठीक कर रहे थे। Otoh, gadt कुछ चीजों को आसान, या अधिक कुशल बनाते हैं। – didierc

+1

मैं कैमल मेलिंग सूची पर 2013 की शुरुआत में गैड पर एक चर्चा भी इंगित करना चाहूंगा: http://lwn.net/Articles/531953/ – didierc

उत्तर

5

जीएडीटी दो कारणों से उपयोगी हैं।

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

जीएडीटी का उपयोग करने का दूसरा कारण यह है कि जब आपके पास कुछ जटिल आविष्कार होता है जिसे आप अपनी प्रकार की संरचना पर बनाए रखना चाहते हैं। यद्यपि व्यक्त करना बहुत मुश्किल है, और आपको अक्सर ऐसा करने के लिए बहुत प्रयास करना पड़ता है। ठीक है, मेरे पास कोई उदाहरण आसान नहीं है, लेकिन मैंने एक बार देखा कि एक दोस्त एवीएल-पेड़ों के कार्यान्वयन को लिखता था, यह टाइपिंग सिस्टम द्वारा सिद्ध किया गया था कि संतुलन सही था, जो बहुत अच्छा है।

जीएडीटी सुविधा और उसके अच्छे उपयोग के मामलों के लिए, आप मैड्स हार्टमैन द्वारा बहुत अच्छे blog post पढ़ सकते हैं।

+0

क्या आप एक उदाहरण दे सकते हैं? इसके साथ और बिना किसी विपरीत के लिए? –

+0

ठीक है, मैड्स हार्टमैन के ब्लॉग पोस्ट के अलावा, आप मानक वितरण में प्रिंटफ के लिए व्यस्त और नए कोड को देखने का प्रयास कर सकते हैं। Https://github.com/ocaml/ocaml/blob/trunk/stdlib/camlinternalFormatBasics.ml और printf.ml फ़ाइल (एक ही निर्देशिका) देखें, फिर 4.00 शाखा से तुलना करें (जीएडीटी प्रारूप यहां से पहले)। – PatJ

+0

'printf' एक बहुत अच्छा उदाहरण है। –

3

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

  1. सार्वभौमिक मूल्य, उर्फ ​​अस्तित्व। वे आपको विषम कंटेनर और टाइपएफ़ सीरियलाइजेशन बनाने की अनुमति देते हैं। उदाहरण के लिए कोर के Univ और Univ_map मॉड्यूल देखें।

  2. सिंटैक्स पेड़ के लिए टाइप-सुरक्षित मूल्यांकनकर्ता। यहां कुछ रनटाइम चेक हटाने के लिए जीएडीटी उपयोगी हैं।

  3. शुद्ध और प्रकार- सुरक्षित Printfimplementation, कि पहले से ही OCaml का एक हिस्सा भी GADT

  4. का उपयोग कर

यहाँ कैसे GADT इस्तेमाल किया जा सकता का एक वास्तविक जीवन example है पुनः लिखा गया है। उदाहरण में, मैं तालिका संबंध निर्दिष्ट करने के लिए जीएडीटी का उपयोग करता हूं, उदाहरण के लिए, one_to_one, one_to_many, आदि। प्रयुक्त संबंध के आधार पर फ़ंक्शन प्रकार का अनुमान लगाया जाता है। उदाहरण के लिए, one_to_maybe_one संबंध, एक फ़ंक्शन 'a -> 'b option, one_to_many'a -> 'b list के साथ एक फ़ंक्शन बनाता है। link_one_to_one, link_one_to_many, आदि जैसे एक फ़ंक्शन link ~one_to:relation के बजाय कई अलग-अलग फ़ंक्शंस बनाकर इसे हासिल किया जा सकता है। तो, कोई इस दृष्टिकोण को तर्कसंगत मान सकता है।

+0

क्या आप कृपया अपना उत्तर विस्तारित कर सकते हैं कि यह क्यों समझा जा सकता है उनके बिना, और आमतौर पर एक और अधिक क्लीनर तरीके में। यदि यह सच है, तो 4.00 ने GADT क्यों जोड़ा? क्या आप कृपया एक सरल प्रदर्शन भी दे सकते हैं? –

+2

मुझे लगता है कि तुमने मुझे गलत तरीके से पढ़ाया। मैं दावा नहीं कर रहा हूं कि सामान्य रूप से जीएडीटी बेकार है। मैं दावा कर रहा हूं कि कई दैनिक कार्यों में आपको उनका उपयोग नहीं करना चाहिए, खासकर अगर उनके बिना क्लीनर समाधान हो। यह कथन प्रथम श्रेणी के मॉड्यूल, मज़ेदार, कक्षाओं तक बढ़ाया जा सकता है। लेकिन यह कहना नहीं है कि वे बेकार हैं। उदाहरण के लिए, जीएडीटी के बिना सार्वभौमिक मूल्य (हैक के बिना) असंभव हैं। – ivg

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