मेरे पास कुछ हास्केल कोड है जो एक अनंत सूची पर सही ढंग से काम करता है, लेकिन मुझे क्यों नहीं समझता है यह सफलतापूर्वक ऐसा कर सकता है। (मैंने अपना मूल कोड संशोधित किया - जिसने अनंत सूचियों को संभाल नहीं लिया - ऑनलाइन किसी अन्य कोड से कुछ शामिल करने के लिए, और अचानक मुझे लगता है कि यह काम करता है लेकिन पता नहीं क्यों)।यह हास्केल कोड अनंत सूचियों के साथ सफलतापूर्वक क्यों काम करता है?
myAny :: (a -> Bool) -> [a] -> Bool
myAny p list = foldr step False list
where
step item acc = p item || acc
foldr की मेरी समझ है कि यह होगा की सूची में हर आइटम के माध्यम से लूप (और शायद कि समझे नहीं जा सके) है। यदि ऐसा है, तो इससे कोई फर्क नहीं पड़ता कि कैसे "चरण" फ़ंक्शन वाक्यांशित किया जाता है ... कोड अनंत लूप को संभालने में असमर्थ होना चाहिए।
हालांकि, निम्नलिखित काम करता है:
*Main Data.List> myAny even [1..]
True
कृपया मदद मुझे समझने: क्यों ??
इसके अतिरिक्त आप यह सत्यापित कर सकते हैं कि कोड 2 से अधिक तत्वों की गणना नहीं करता है: 'myAny p list = foldr (\ ia -> trace (show i) (pi || a))' - जो केवल '1 2 दिखाएगा) सही ' – viraptor
वाह, यह एक बहुत ही आँख खोलने की प्रतिक्रिया रही है। सबसे पहले, मैंने मेरे सामने फ़ोल्डर की परिभाषा शुरू नहीं की थी। मुझे लगता है कि इसका कोड उन्नत सुविधाओं का उपयोग करेगा जो मुझे अभी तक नहीं पता है, इसलिए मैं इसे अंतिम उपाय के रूप में देखने जा रहा था। आपकी प्रतिक्रिया ने मुझे एक नज़र डालने के लिए प्रेरित किया, और यह बहुत स्पष्ट करता है। फ़ोल्डर स्वयं "सादा पुराना" संरचनात्मक रिकर्सन का उपयोग कर रहा है। मैं जिस तरह से इसे तोड़ता हूं उससे प्यार करता हूँ। धन्यवाद। –
बीटीडब्ल्यू, || है अपने पहले तर्क में पूरी तरह सख्त है, या यह केवल अपने पहले तर्क को "वरीयता देता है"? उदाहरण के लिए, अगर तर्क 2 पहले से ही eval'd किया गया था, लेकिन क्या तर्क 1 अभी भी एक थंक था? और कहें कि तर्क 2 झूठा था। विपरीत दिशा में हास्केल शॉर्ट सर्किट होगा? धन्यवाद। –