9

क्या ओकैम में इसे परिभाषित करने से पहले कोई फ़ंक्शन घोषित करने का कोई तरीका है? मैं एक ओकैमल दुभाषिया का उपयोग कर रहा हूँ।ओकैमल: इसे परिभाषित करने से पहले एक फ़ंक्शन घोषित करना

let myFunctionA = 
(* some stuff here..... *) myFunctionB (*some stuff *) 

let myFunctionB = 
(* some stuff here .... *) myFunctionA (* some stuff *) 

यह, हालांकि काम नहीं करता है के बाद से myFunctionA myFunctionB फोन नहीं कर सकते हैं इससे पहले कि यह बना है:

मैं दो कार्य किया है।

मैंने कुछ Google खोज की हैं लेकिन कुछ भी नहीं मिल रहा है। मैं यह कैसे हासिल कर सकता हूं?

+0

प्रासंगिक कीवर्ड: "ocaml corecursive function"। देखें [ओकैम पर नोट्स: परस्पर रिकर्सिव फ़ंक्शंस] (http://www.csc.villanova.edu/~dmatusze/resources/ocaml/ocaml.html#Mutually%20recursive%20functions)। –

+1

मैं नहीं कह सकता कि मैंने कभी भी पारस्परिक रिकर्सन को इंगित करने के लिए सह-पुनरावर्तन सुना है - लेकिन, यह स्पष्ट है कि इसका क्या अर्थ होगा। – nlucaroni

उत्तर

21

आप जो चाहते हैं वह इन दो कार्यों को पारस्परिक रूप से रिकर्सिव बनाना है। इसके बजाय का उपयोग कर "चलो ... चलो ..." की, तो आप "... आरईसी हैं ... और" के रूप में इस का उपयोग करने के:

let rec myFunctionA = 
(* some stuff here..... *) myFunctionB (*some stuff *) 

and myFunctionB = 
(* some stuff here .... *) myFunctionA (* some stuff *) 
2

वास्तव में "आरईसी जाने .." एक बहुत ही गंभीर है सीमा: यह केवल एक मॉड्यूल के भीतर काम करता है। यह प्रोग्रामर को बड़े मॉड्यूल लिखने के लिए मजबूर करता है जहां यह वांछित नहीं है .. एक समस्या जो कम से कम सी में नहीं होती है!

कई कामकाज हैं, सभी असंतोषजनक। सबसे पहले फ़ंक्शन प्रकार का चर बनाना है और प्रारंभ में उसमें एक अपवाद उठाने वाला फ़ंक्शन संग्रहीत करना है, फिर बाद में वांछित मान संग्रहीत करना है।

दूसरा वर्ग प्रकारों और वर्गों (और एक संकेत) का उपयोग करना है। यदि आपके पास पारस्परिक रूप से रिकर्सिव फ़ंक्शंस हैं तो यह सबसे अच्छा तरीका है (क्योंकि आपको केवल उनमें से प्रत्येक को एक ऑब्जेक्ट पास करने की आवश्यकता है)।

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

+0

ध्यान दें कि यह अब रिकर्सिव मॉड्यूल द्वारा कुछ हद तक आसान है, उदाहरण के लिए: http://stackoverflow.com/a/33482273/2482998। हालांकि, यह अभी भी बहुत अजीब है। – antron

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