F # में rec कीवर्ड की आवश्यकता क्यों है?


28

F # में recकीवर्ड का उपयोग करना आवश्यक है । हास्केल में स्पष्ट रूप से यह बताने की आवश्यकता नहीं है कि क्या दिया गया फ़ंक्शन पुनरावर्ती है या नहीं।

कार्यात्मक प्रोग्रामिंग में पुनरावृत्ति की भूमिका को देखते हुए, एफ # डिजाइन मुझे अजीब लगता है। क्या यह एक अच्छा भाषा डिजाइन निर्णय है या यह केवल ऐतिहासिक कारण के लिए या कार्यान्वयन बाधा के कारण मौजूद है?

जवाबों:


16

हास्केल और एफ # शब्दार्थ में एक अंतर्निहित अंतर है। हास्केल में, एक फ़ंक्शन कॉल कोई वास्तविक गणना नहीं करता है, लेकिन एक 'thunk' के रूप में ज्ञात ढेर ऑब्जेक्ट आवंटित करता है। यह एक ठग के लिए पूरी तरह से ठीक है कि उसके पास खुद या किसी दूसरे ठग का लिंक हो। हालांकि, एफ # में, एक फ़ंक्शन कॉल एक वास्तविक कॉल है, जिससे अभिव्यक्ति let x = 1 : 2 : x in xअवैध हो जाती है - जैसा कि इसके xनिर्माण से पहले निर्माण करने की आवश्यकता होती 1 : 2 : xहै। हालांकि, यह अनंत सूची के लिए अभी भी कम या ज्यादा उचित परिभाषा है, इसे परिभाषित करने का कोई तरीका मौजूद होना चाहिए। यहाँ जड़ों के लिए निहित है rec। यदि आप अधिक चाहते हैं, तो एसएमएल और हास्केल के लिए परिचालन शब्दार्थ के लिए खोज करें और पढ़ें - यह अलग है।


2
AFAIK, हास्केल उद्देश्यपूर्ण रूप से एक परिचालन शब्दार्थ नहीं है।
dan_waterworth

@dan_waterworth को परिभाषित किए बिना परिचालनात्मक शब्दार्थ को संकलित करना असंभव है।
परमकेरा

8
हास्केल भाषा एक परिचालनात्मक शब्दार्थ को परिभाषित नहीं करती है, बल्कि इसके बजाय एक शब्दार्थ शब्दार्थ प्रदान करती है। जब आप एक कंपाइलर का निर्माण करते हैं, तो एक परिचालनात्मक शब्दार्थ को स्पष्ट रूप से परिभाषित किया जाता है, लेकिन इसका मतलब यह नहीं है कि यह हास्क भाषा मानक का हिस्सा है।
dan_waterworth

6
@dan_waterworth व्यवहार में हास्केल भाषा का केवल एक कार्यान्वयन और मानक है: ghc, साथ ही इसमें केवल एक F # मानक है: Microsoft का कार्यान्वयन। तो सैद्धांतिक रूप से आप सही हो सकते हैं, लेकिन अभ्यास पूरी तरह से अलग जानवर है।
परमकेरा

19

इस सवाल का उत्तर SO पर दिया गया है , और इसमें "rec" का उपयोग करने के लिए कुछ मजबूत ऐतिहासिक पृष्ठभूमि शामिल है।

यहाँ पोस्टर के लिए महत्वपूर्ण उद्धरण है:

भाषाओं के फ्रेंच CAML परिवार में डिफ़ॉल्ट रूप से कार्य पुनरावर्ती नहीं हैं (OCaml सहित)। यह विकल्प उन भाषाओं में let का उपयोग करके सुपरसीड फ़ंक्शन (और चर) परिभाषाओं को आसान बनाता है क्योंकि आप एक नई परिभाषा के शरीर के अंदर पिछली परिभाषा का उल्लेख कर सकते हैं। F # को OCaml का यह सिंटैक्स विरासत में मिला है।


12

एक पुनरावर्ती letएक सामान्य से काफी अधिक जटिल शब्दार्थ को परिभाषित करता है। इसलिए, सादगी और स्वच्छ भाषा डिजाइन की एक खातिर, दोनों, अलग होने के रूप में सिर्फ एक ही करने के लिए एक अच्छा कारण है let, let*और letrecइस योजना में।

सरल let x = y in zके बराबर है ((fun x -> z) y)। एक पुनरावर्ती चलो बहुत अधिक जटिल है और इसमें एक निश्चित बिंदु कॉम्बिनेटर का उपयोग करना शामिल हो सकता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.