2017-02-22 9 views
6

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

मुझे पता है कि निम्न प्रोग्राम कानूनी है।

type t1 = A of int | B of t2 
and t2 = C of float | C of t1 

अब, मैं (क्योंकि util कार्यों का एक बहुत indivisually आवश्यक हैं) पठनीयता के लिए अन्य फ़ाइलों में इस t1 और t2 परिभाषित करना चाहते हैं।

मुझे यह भी पता है, मैं .mli फ़ाइलें बनाकर जैसा कि ऊपर t1 और t2 को परिभाषित करने और कार्यान्वयन विवरण छिपा कर सकते हैं (बस type t1 और type t2 लिखने .mli फाइलों में)।

लेकिन, अब मैं उन्हें छिपाना नहीं चाहता हूं। क्या कोई जानता है कि इसे कैसे करें?

मुझे आशा है कि सरल समाधान (जटिल या जादू का उपयोग न करें ...)।

उत्तर

7

ओकैमल के वर्तमान कार्यान्वयन में, संकलन इकाई निर्भरता ग्राफ विश्वकोश होना चाहिए। इसे अधिक सरलता से, संकलन इकाइयों (यानी, विभिन्न फाइलें), पारस्परिक रूप से एक-दूसरे को संदर्भित नहीं कर सकते हैं।

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

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

type 'b a = A of int | B of 'b 
type 'a c = C of float | C of 'a 
type t1 = t2 a and t2 = t1 c 

अब आप 'b a के लिए इंटरफ़ेस का एक अचक्रीय हिस्सा परिभाषित कर सकते हैं। यह इंटरफ़ेस 'b प्रकार चर के संबंध में सामान्य होना चाहिए (दूसरे शब्दों में इसे स्पर्श नहीं करना चाहिए)। हमारे उदाहरण में, इस तरह के इंटरफ़ेस की कल्पना करना मुश्किल है, लेकिन, यह मानते हुए कि उदाहरण कृत्रिम है, लेकिन उत्पाद प्रकारों के लिए यह विधि समझ में आएगी (सीएफ, type 'b a = {a : int; b : 'b} - आप a फ़ील्ड से संबंधित सभी कार्यों को कार्यान्वित कर सकते हैं)।

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

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