2014-11-16 6 views
9

हास्केल में, यह सिलवटों, नक्शे की तरह उच्च क्रम कार्यों में अपने कोड के रूप में ज्यादा लिखने के लिए मुहावरेदार है, और संभव के रूप में करेंगी। तो उन उच्च-आदेश कार्यों के साथ किस प्रकार का कोड नहीं लिखा जा सकता है? स्पष्ट रिकर्सन कब आवश्यक है?स्पष्ट रिकर्सन कब आवश्यक है?

+3

क्या आप पूछ रहे हैं कि रिकर्सन * आवश्यक * है या जब यह * idiomatic * है? आपका शीर्षक पहला कहता है; आपका अंतिम वाक्य दूसरा कहता है। –

+0

अच्छा बिंदु। मैं दोनों तरह सोच रहा था, लेकिन मैं इसे एक प्रश्न पर सीमित कर दूंगा: स्पष्ट रिकर्सन वास्तव में कब आवश्यक है? मैं सवाल संपादित करूंगा। –

+1

'नक्शा' और' गुना 'जैसे उच्च आदेश कार्यों को रिकर्सन के साथ कार्यान्वित किया जाता है। यदि आप उनका उपयोग कर रहे हैं, अर्थात्, आप रिकर्सन का उपयोग कर रहे हैं। संवैधानिक रूप से, आपको "कैननिकल रिकर्सिव फ़ंक्शन" को परिभाषित करने के लिए - एक बार छोड़कर रिकर्सन का उपयोग कभी नहीं करना होगा - 'ठीक करें = x = x x x x में चलो। – user2407038

उत्तर

15

मान लीजिए कि हमारे पास रिकर्सन या इसके जैसा कुछ भी नहीं है। इसका मतलब है कि कोई लूपिंग संरचनाएं नहीं हैं। इसका मतलब यह भी है कि हमारे पास (गैर-पुनरावर्ती) प्रकार भी हैं ताकि हम वाई-संयोजक बन सकें और भाग सकें। इस भाषा में, हम वास्तव में कमजोर हैं, हमारे कई उपकरणों से अलग हैं।

लेकिन हम इस भाषा के बारे में बहुत अच्छा सवाल पूछ सकते हैं। अर्थात्, ऐसी किसी भी प्रतिबंध के साथ ऐसी भाषा के रूप में उतनी ही शक्तिशाली बनने के लिए हमें सबसे छोटी चीज़ क्या देनी चाहिए?

यह पता चला है कि दो जवाब हैं।

  1. हम पुनरावर्ती बाइंडरों लागू कर सकते हैं, एक let rec आदेश या हास्केल के let की तरह कुछ जो हमेशा let rec है की तरह। दूसरे शब्दों में, एक संरचना जो हमें let x = e in b परिभाषित करने देती है जैसे कि xe में निःशुल्क है, तो यह समीकरण x = e पर एक निश्चित बिंदु के रूप में गणना की जाती है।

  2. हम 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

मुझे लगता है कि बहुत से लोग म्यू/फिक्स/न्यू प्रकारों से पढ़ने के लिए रिकर्सिव डेटा परिभाषाओं को आसानी से ढूंढते हैं। यह कड़ाई से जरूरी नहीं है, लेकिन वहां बहुत उपयोगी है।

इसी तरह, आप रिकर्सन का उपयोग करके इस तरह के डेटा प्रकार के लिए फोल्डबल/अनफोल्डबे उदाहरण लिखेंगे, लेकिन एक बार प्रदान किए जाने के बाद, स्पष्ट रिकर्सन आगे बढ़ने की आवश्यकता नहीं है।

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