2011-03-27 15 views
7

मुझे ओकंपल में सरणी को लागू करने में थोड़ी सी समस्या आई। उदाहरण के लिए, जब टर्मिनल (konsole) और मैं पर टाइपओकंपल कार्यान्वयन

let tab = Array.make 5 6; 

मैं एक आउटपुट के रूप में

val tab : int array = [|6; 6; 6; 6; 6|] 

है। तो यह 5 की लंबाई के साथ एक सरणी बनाता है और सभी मामलों को 6 के साथ भरता है। ठीक है, मैं उस हिस्से को समझता हूं। लेकिन जब मैं उदाहरण के लिए केट की तरह एक पाठ संपादक पर लिखते हैं, तो बचाने के लिए और मैं इस त्रुटि मिलती है यह संकलन:

Error: Unbound value Array.make 

मुझे समझ नहीं आता क्यों यह सरणी लेता है। केट में एक मूल्य के रूप में बनाओ और यह टर्मिनल में एक समारोह के रूप में Array.make लेता है। मैंने फ़ाइल को ".ml" एक्सटेंशन से सहेजा और मैं इसे ocamlc -o test name_of_file का उपयोग करके संकलित करता हूं। कोई सुझाव कृपया? धन्यवाद।

उत्तर

5

मैंने आपके प्रोग्राम को ocamlc के साथ संकलित किया और यह ठीक हो गया (ओकैमल 3.12.0 का उपयोग करके)।

मुझे लगता है कि संकलन करने का प्रयास करते समय आप कंपाइलर का पुराना संस्करण बुला रहे हैं, शायद Array.make से Array.create नामित किया गया था। शायद जब आप नया संस्करण स्थापित करते हैं, तो आप कुछ फ़ाइलों को ओवरराइट करते हैं (जैसे कि अपूर्ण) लेकिन दूसरों को नहीं (जैसे संकलक)। जांचने के लिए, ocamlc -v और ocaml द्वारा दिए गए संस्करणों की तुलना करें।

ओकैमल में "अनबाउंड मान" संदेश के लिए, कार्य मूल्य हैं। कार्यान्वयनकर्ता "अनबाउंड वैल्यू जो फ़ंक्शन नहीं है" और "अनबाउंड वैल्यू जो फ़ंक्शन है" के बीच अंतर नहीं करता है, लेकिन यह समस्या का कारण नहीं है। आपकी समस्या का कारण यह है कि Array.make बिल्कुल अनबाउंड है।

+0

दोनों ने मुझे एक ही संस्करण दिया। संस्करण 3.11.2। मुझे नहीं लगता कि मैं पिछले संस्करण से संबंधित किसी भी फाइल को ओवरराइट करता हूं। मैंने बस अपने पीसी पर लिनक्स स्थापित किया है, इसलिए मेरे पास ओकंपल का पिछला संस्करण नहीं था। मैंने ओकंपल टाइप करके सत्यापित किया और यह लिखा कि ओकैम अभी तक स्थापित नहीं है इसलिए मैंने इसे अभी इंस्टॉल किया है .. यह संस्करण 3.11.2 है। मैंने Array.create की कोशिश की लेकिन मुझे अभी भी एक ही समस्या है। क्या आपको लगता है कि यह उस संस्करण के कारण है जिसका मैं उपयोग कर रहा हूं? – mkab

+0

@mktab यह निश्चित रूप से संस्करण 3.11.2 के साथ काम करना चाहिए। संस्करण 3.12.0 आपको बताएगा कि क्या यह मॉड्यूल 'ऐरे' या फ़ंक्शन 'मेक' है जो अनबाउंड है, इस संस्करण को लाए गए कई छोटे सुधारों में से एक है, लेकिन आपको जो त्रुटि मिल रही है वह एक रहस्य है। –

+2

@mktab यह संभावना है कि फ़ाइल .../lib/ocaml/array.cmi संकलक द्वारा नहीं मिला है। शायद यह गायब है, या आपके वितरण का पैकेज किसी अन्य गंतव्य में फाइलों की प्रतिलिपि बनाकर अनुचित रूप से तैयार किया गया था, जिसमें कंपाइलर को स्थापित करने के लिए कॉन्फ़िगर किया गया था। यदि ऐसा है, तो आप विकल्पों का उपयोग कर इसे ठीक कर सकते हैं- I और -L, लेकिन I स्रोतों से OCaml को फिर से संकलित करने की अनुशंसा करते हैं। –

3

मुझे त्रुटि मिली। यह एक बहुत बेवकूफ है। मैंने अपनी फाइल को "array.ml" के रूप में सहेजा। तो संकलन के दौरान यह एक array.cmi फ़ाइल बनाई और मुझे लगता है कि इस फ़ाइल को इस फ़ाइल में भ्रमित कर दिया गया है .../lib/ocaml/array.cmi। मैं बहुत पक्का नहीं हूँ। इसलिए मैंने फ़ाइल को "table.ml" में बदल दिया और यह पूरी तरह से संकलित किया गया। यह पागल है कि यह इन दो फाइलों को उलझन में

+0

तब स्पष्ट रूप से '../ lib/ocaml/array.cmi' निर्दिष्ट कैसे करें? – updogliu

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