हास्केल में, यह सिलवटों, नक्शे की तरह उच्च क्रम कार्यों में अपने कोड के रूप में ज्यादा लिखने के लिए मुहावरेदार है, और संभव के रूप में करेंगी। तो उन उच्च-आदेश कार्यों के साथ किस प्रकार का कोड नहीं लिखा जा सकता है? स्पष्ट रिकर्सन कब आवश्यक है?स्पष्ट रिकर्सन कब आवश्यक है?
उत्तर
मान लीजिए कि हमारे पास रिकर्सन या इसके जैसा कुछ भी नहीं है। इसका मतलब है कि कोई लूपिंग संरचनाएं नहीं हैं। इसका मतलब यह भी है कि हमारे पास (गैर-पुनरावर्ती) प्रकार भी हैं ताकि हम वाई-संयोजक बन सकें और भाग सकें। इस भाषा में, हम वास्तव में कमजोर हैं, हमारे कई उपकरणों से अलग हैं।
लेकिन हम इस भाषा के बारे में बहुत अच्छा सवाल पूछ सकते हैं। अर्थात्, ऐसी किसी भी प्रतिबंध के साथ ऐसी भाषा के रूप में उतनी ही शक्तिशाली बनने के लिए हमें सबसे छोटी चीज़ क्या देनी चाहिए?
यह पता चला है कि दो जवाब हैं।
हम पुनरावर्ती बाइंडरों लागू कर सकते हैं, एक
let rec
आदेश या हास्केल केlet
की तरह कुछ जो हमेशाlet rec
है की तरह। दूसरे शब्दों में, एक संरचना जो हमेंlet x = e in b
परिभाषित करने देती है जैसे किx
e
में निःशुल्क है, तो यह समीकरणx = e
पर एक निश्चित बिंदु के रूप में गणना की जाती है।हम
fix :: (a -> a) -> a
फ़ंक्शन को पेश कर सकते हैं जैसे किfix f
एक चरण सेf (fix f)
में कम हो जाता है।
यह ऊपर प्रस्तुति कि fix
पुनरावर्ती बाइंडरों का उपयोग कर कार्यान्वित किया जा सकता से स्पष्ट किया जाना चाहिए। क्या थोड़ा कम स्पष्ट है कि पुनरावर्ती बाइंडरों ठीक उपयोग करते हुए गैर पुनरावर्ती लोगों से लागू किया जा सकता है, लेकिन यहाँ हम कर रहे हैं:
let x = fix $ \this -> e
मूल्य this
पूरे अभिव्यक्ति जो x
के रूप में बाध्य समाप्त होता है को संदर्भित करता है जो सिर्फ क्या हम चाहते हैं।
तो क्यों मैं अपने रास्ते ऊपर के सभी कहने के लिए से बाहर चले गए?
अनिवार्य रूप से, मैं यह तर्क देना चाहता हूं कि एचआईएफ संयोजकों जैसे map
के माध्यम से पुनरावृत्ति जरूरी है, जब तक आप उस सूची में fix
पर विचार करने के इच्छुक हैं। मैं यह भी तर्क देना चाहूंगा कि उस सेट में संयोजकों द्वारा लागू किए गए किसी भी पुनरावर्तन को रिकर्सिव बाइंडर्स का उपयोग करके "स्पष्ट रूप से" किया जा सकता है। वे समान रूप से शक्तिशाली हैं।
दिलचस्प भाग में, जब आप खुद से foldr
/unfoldr
तरह HOF combinators पर विचार आता है। ये तकनीकी रूप से कुछ हद तक कमजोरfix
से/पुनरावर्ती बाइंडरों हैं। इसका फायदा यह है कि यदि आप प्रोग्रामिंग भाषा का निर्माण केवल foldr
/unfoldr
के सिद्धांतों के समान चुनते हैं तो आप एक बहुत ही समृद्ध, उप-ट्यूरिंग पूर्ण भाषा प्राप्त कर सकते हैं जो कुल हो सकता है या समाप्त होने की गारंटी हो सकती है।
मुझे लगता है कि बहुत से लोग म्यू/फिक्स/न्यू प्रकारों से पढ़ने के लिए रिकर्सिव डेटा परिभाषाओं को आसानी से ढूंढते हैं। यह कड़ाई से जरूरी नहीं है, लेकिन वहां बहुत उपयोगी है।
इसी तरह, आप रिकर्सन का उपयोग करके इस तरह के डेटा प्रकार के लिए फोल्डबल/अनफोल्डबे उदाहरण लिखेंगे, लेकिन एक बार प्रदान किए जाने के बाद, स्पष्ट रिकर्सन आगे बढ़ने की आवश्यकता नहीं है।
- 1. वापसी विवरण के लिए स्पष्ट कदम कब आवश्यक है?
- 2. 'यह' कब आवश्यक है?
- 3. IPPROTO_UDP कब आवश्यक है?
- 4. कब निपटान आवश्यक है?
- 5. "स्वयं" कब आवश्यक है?
- 6. ScriptManager/ScriptManagerProxy कब आवश्यक है?
- 7. यह स्पष्ट अनंत रिकर्सन क्यों एक कंपाइलर चेतावनी देता है?
- 8. "आवश्यक" प्रभावशाली भाषाओं में रिकर्सन का उपयोग
- 9. आईपैड स्पष्ट लाइब्रेरी/कैश कब करता है?
- 10. रुबी में आवश्यक कीवर्ड कब होता है?
- 11. 'यील्ड' कब वास्तव में आवश्यक है?
- 12. पुनर्वितरण विकल्प वास्तव में कब आवश्यक है?
- 13. सी # स्पष्ट समानता ऑपरेटर कार्यान्वयन आवश्यक
- 14. रिकर्सन
- 15. बैकबोन model.destroy(): संग्रह से स्पष्ट हटाने को आवश्यक है?
- 16. रिकर्सन
- 17. रिकर्सन
- 18. रिकर्सन
- 19. रिकर्सन
- 20. रिकर्सन
- 21. रिकर्सन
- 22. रिकर्सन
- 23. रिकर्सन
- 24. रिकर्सन
- 25. रिकर्सन
- 26. रिकर्सन
- 27. कब और क्यों सभी मैवेन परियोजनाओं का पुनर्मूल्यांकन आवश्यक है?
- 28. विंडोज़ में सी ++ में "बाहरी सी" कब आवश्यक है?
- 29. एंड्रॉइड प्रमाणीकरण प्रबंधक, उपयोगकर्ता अनुमति कब आवश्यक है?
- 30. आवंटकों क्या हैं और उनका उपयोग कब आवश्यक है?
क्या आप पूछ रहे हैं कि रिकर्सन * आवश्यक * है या जब यह * idiomatic * है? आपका शीर्षक पहला कहता है; आपका अंतिम वाक्य दूसरा कहता है। –
अच्छा बिंदु। मैं दोनों तरह सोच रहा था, लेकिन मैं इसे एक प्रश्न पर सीमित कर दूंगा: स्पष्ट रिकर्सन वास्तव में कब आवश्यक है? मैं सवाल संपादित करूंगा। –
'नक्शा' और' गुना 'जैसे उच्च आदेश कार्यों को रिकर्सन के साथ कार्यान्वित किया जाता है। यदि आप उनका उपयोग कर रहे हैं, अर्थात्, आप रिकर्सन का उपयोग कर रहे हैं। संवैधानिक रूप से, आपको "कैननिकल रिकर्सिव फ़ंक्शन" को परिभाषित करने के लिए - एक बार छोड़कर रिकर्सन का उपयोग कभी नहीं करना होगा - 'ठीक करें = x = x x x x में चलो। – user2407038