से गुना कम कुशल का उपयोग कर रहा है, मैं अभी आपको एक हास्केल पुस्तक सीखने जा रहा हूं और मैं इस बारे में उत्सुक हूं कि यह विशेष उदाहरण कैसे काम करता है। पुस्तक पहले पारंपरिक प्रत्यावर्तन का उपयोग कर findKey
के एक कार्यान्वयन को दर्शाता है:मानक रिकर्सन
findKey :: (Eq k) => k -> [(k,v)] -> Maybe v
findKey key [] = Nothing
findKey key ((k,v):xs) = if key == k
then Just v
else findKey key xs
किताब फिर foldr
findKey :: (Eq k) => k -> [(k,v)] -> Maybe v
findKey key = foldr (\(k,v) acc -> if key == k then Just v else acc) Nothing
का उपयोग कर मानक प्रत्यावर्तन के साथ एक छोटी कार्यान्वयन के साथ इस प्रकार है, समारोह तुरंत लौट जाना एक बार यह हिट प्रदान की गई कुंजी के साथ पहला तत्व। यदि मैं foldr
कार्यान्वयन को सही ढंग से समझता हूं, तो यह हर बार पूरी सूची में फिर से चालू हो जाएगा, भले ही यह पहले तत्व से मेल खाता हो। यह समस्या को संभालने के लिए एक बहुत ही कुशल तरीका प्रतीत नहीं होता है।
क्या ऐसा कुछ है जो मुझे नहीं मिल रहा है कि foldr
कार्यान्वयन कैसे काम करता है? या क्या हास्केल के भीतर कुछ प्रकार का जादू है जो इस कार्यान्वयन को अक्षम नहीं करता है जैसा कि मुझे लगता है कि यह है?
नोट: कंपाइलर आपकी सामान्य रिकर्सिव परिभाषा की किसी भी संपत्ति का उपयोग करने में सक्षम नहीं है। हालांकि संकलक जानता है कि पुनर्लेखन नियमों के माध्यम से 'फ़ोल्डर' का इलाज कैसे करें, जिसका अर्थ है कि 'फ़ोल्डर' के माध्यम से परिभाषित कार्यों को संकलक को कोड को और अनुकूलित करने की अनुमति मिलती है। – Bakuriu