/ / एक प्रकार के रूप में घोषित किए जाने पर मेरी टाइप परिभाषा को चक्रीय के रूप में क्यों खारिज कर दिया गया, लेकिन अन्यथा स्वीकार किया गया? - प्रकार, कार्यात्मक-प्रोग्रामिंग, ओमालम, एमएल, चक्रीय

एक प्रकार के रूप में घोषित किए जाने पर मेरी टाइप परिभाषा चक्रवात के रूप में क्यों खारिज की जाती है, लेकिन अन्यथा स्वीकार की जाती है? - प्रकार, कार्यात्मक-प्रोग्रामिंग, ओकंपल, एमएल, चक्रीय

मैं OCaml को क्रिस ओकासाकी के विशुद्ध रूप से कार्यात्मक डेटा संरचनाओं में कुछ डेटा संरचनाओं को लागू करने के साथ खिलवाड़ कर रहा था और इस प्रकार की परिभाषा में आया था:

 type tree = Node of int * int * tree list;;

मुझे नहीं लगा कि इसे टैग की आवश्यकता है क्योंकि यह एक यूनियन प्रकार नहीं है, इसलिए मैंने टैग को हटाने की कोशिश की, हालांकि मुझे निम्नलिखित त्रुटि मिली:

# type tree = int * int * tree list;;
Characters 5-33:
type tree = int * int * tree list;;
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Error: The type abbreviation tree is cyclic

ऐसा प्रतीत होता है कि दो समान प्रकार की परिभाषाएँ क्यों हैं?

उत्तर:

जवाब के लिए 8 № 1

एमएल जैसी भाषाओं में, एक की परिभाषापुनरावर्ती प्रकार वह है जहां पुनरावृत्ति एक वैरिएंट प्रकार से नहीं गुजरती है। यह एक व्यावहारिक परिभाषा है, इस अर्थ में कि यह अधिक उपयोगी प्रकार की जाँच का नेतृत्व करता है।

पुनरावर्ती प्रकारों के बारे में कुछ भी स्पष्ट नहीं है। आप OCaml में पुनरावर्ती प्रकारों के लिए समर्थन सक्षम कर सकते हैं -rectypes झंडा।

$ ocaml -rectypes
OCaml version 4.02.1

# type tree = int * int * tree list;;
type tree = int * int * tree list
# let x: tree = (3, 3, [(4, 4, [])]);;
val x : tree = (3, 3, [(4, 4, [])])

सभी सामान्य मजबूत टाइपिंग गारंटी हैंवर्तमान में जब पुनरावर्ती प्रकार सक्षम होते हैं। मुख्य नकारात्मक पक्ष यह है कि कई अनपेक्षित कार्यक्रम स्वीकार किए जाते हैं। दूसरे शब्दों में, एक पुनरावर्ती प्रकार की उपस्थिति अक्सर एक प्रोग्रामिंग त्रुटि का संकेत है।


उत्तर № 2 के लिए 1

पहले प्रकार की परिभाषा नए प्रकार को परिभाषित करती है। जब आप कंस्ट्रक्टर के नाम को छोड़ देते हैं, तो नए प्रकार को परिभाषित करने के बजाय आप वास्तव में एक प्रकार का संक्षिप्त नाम प्रस्तुत कर रहे हैं। और डिफ़ॉल्ट रूप से संक्षिप्त रूप से पुनरावर्ती होने की अनुमति नहीं है, क्योंकि आमतौर पर इसका मतलब यह नहीं है।

आप किसी भी प्रकार के वाक्यविन्यास का उपयोग कर सकते हैं जो नए प्रकार को परिभाषित करता है, न कि केवल वेरिएंट को पुनरावर्ती प्रकार बनाने के लिए। उदाहरण के लिए, रिकॉर्ड भी काम करेगा

type tree = { node : int * int * tree list }

या इससे भी बेहतर

type tree = {
value : int;
depth : int;
children : tree list;
}

(ध्यान दें: क्षेत्र के नाम मनमाने ढंग से चुने गए क्योंकि मैं उनका मूल उद्देश्य नहीं जानता)

संक्षेप में, सम प्रकारों का उपयोग न केवल प्रकारों के निराशाजनक सेटों को पेश करने के लिए किया जाता है, बल्कि नए प्रकारों के निर्माण के लिए भी किया जाता है:

 type t = Constr x

प्रकार का परिचय देता है t, कि कंस्ट्रक्टर के साथ निर्माण किया जा सकता है Constr प्रकार के मूल्यों से x.