2012-07-31 11 views
5

में मॉड्यूलर प्रोग्रामिंग मुझे कुछ ऐसा मिला जो मुझे ocaml प्रोजेक्ट पर काम करते समय वास्तव में समझ में नहीं आता है।ओकंपल

मान लीजिए कि मैं ओसीएमएल मानक पुस्तकालय के Array और List मॉड्यूल का उपयोग कर रहा हूं। वे दोनों length फ़ंक्शन को लागू करते हैं लेकिन विभिन्न प्रकार हैं। List मॉड्यूल में, यह अपने प्रकार है:

length: a' list -> int 

और Array मॉड्यूल में, यह प्रकार है:

length: a' array -> int 

लेकिन तब मैं तुम्हें एक ही मॉड्यूल मैं था दोनों में मॉड्यूल का उपयोग करना चाहता था , को लागू करने open कीवर्ड के माध्यम से:

open List 
open Array 

मैं जब एक पर length फ़ंक्शन का उपयोग करने की कोशिश की सूची, संकलन के दौरान मुझे एक प्रकार की त्रुटि थी।
चूंकि ओकैमल एक मजबूत स्थाई रूप से टाइप की गई भाषा है, इसलिए मुझे आश्चर्य है कि क्यों संकलक को पता नहीं था कि मैं सूची मॉड्यूल का लम्बा कार्य चाहता था क्योंकि मैंने घोषणा की कि मैं दोनों का उपयोग कर रहा था।

+1

"मुझे आश्चर्य है कि क्यों संकलक को पता नहीं था कि मैं सूची मॉड्यूल का लम्बा कार्य चाहता था क्योंकि मैंने घोषणा की थी कि मैं दोनों का उपयोग कर रहा था" हां, लेकिन 'मजेदार एस -> लंबाई एस' का प्रकार क्या होगा तब यह संदर्भ? –

+0

jrouquie के उत्तर के आधार पर, यह 'ए' सरणी होगा -> int' –

+1

बिल्कुल, लेकिन एक अनुमानित ओकैमल कंपाइलर के मामले में अनुमान लगाने की कोशिश की गई, ओकैमल प्रकार प्रणाली में कोई भी सामान्य प्रकार नहीं होगा समारोह के लिए। आपको इस परेशानी के लिए हास्केल के समाधान से रूचि हो सकती है, कक्षाएं टाइप करें: http://www.haskell.org/tutorial/classes.html –

उत्तर

8

ओकैमल अपने कार्यों के आधार पर एक फ़ंक्शन या कोई अन्य नहीं चुनता है।

जब आप

open Array 

मॉड्यूल Array के कार्यों लिखना ही नाम के साथ मॉड्यूल List के लोगों मास्किंग कर रहे हैं। जब आप बाद में length फ़ंक्शन को कॉल करते हैं, तो ओकैमल length नामक फ़ंक्शन की तलाश करता है, Array.length पाता है, और शिकायत करता है कि इस फ़ंक्शन में संगत प्रकार नहीं है।

सामान्य तरीका List.length (केवल length के बजाय) को कॉल करना है यदि यह आवश्यक कार्य है।


अधिक आम तौर पर, OCaml नाम अधिक भार (अर्थात दो कार्य या एक ही नाम है, लेकिन अलग तर्क प्रकार के साथ ऑपरेटरों वाले), विशेष रूप से, क्योंकि इस प्रकार निष्कर्ष बहुत कठिन होगा नहीं है।

+2

होने के बजाय मैन्युअल रूप से टाइप क्लास का उदाहरण निर्दिष्ट करना होगा: मॉड्यूल खोलने से बचने का प्रयास करें - यह आपके कोड को बहुत कठिन पढ़ता है क्योंकि पाठक को याद रखना चाहिए कि कौन से मॉड्यूल खुले हैं (और किस क्रम में); एक पाठक के रूप में भी आपको तुरंत एहसास नहीं होता है कि एक समारोह कहाँ से आया था (जिसमें से ओपन-एड मॉड्यूल है)। – lambdapower

+2

मैं जोड़ना चाहता हूं कि शुरुआती मॉड्यूल ठीक है यदि उपयोग किए गए मानों/कार्यों की उत्पत्ति स्पष्ट है। तो सूची या ऐरे जैसे मॉड्यूल को न खोलें जो सामान्य नामों के साथ कार्य प्रदान करते हैं, लेकिन "ओपन प्रिंटफ" पूरी तरह से ठीक है क्योंकि यह फ़ंक्शंस प्रिंटफ, fprintf इत्यादि प्रदान करता है, जिसका मूल स्पष्ट है। –

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