reduce
और apply
केवल (लौटे अंतिम परिणाम के संदर्भ में) साहचर्य कार्य करता है जो चर-arity मामले में उनके सभी तर्क देखने की जरूरत के लिए बराबर निश्चित रूप से कर रहे हैं। जब वे परिणामस्वरूप समकक्ष होते हैं, तो मैं कहूंगा कि apply
हमेशा पूरी तरह से मूर्खतापूर्ण है, जबकि reduce
समकक्ष है - और कई आम मामलों में - आंखों के झपकी के एक अंश को बंद कर सकता है। इस पर विश्वास करने के लिए मेरा तर्क क्या है।
+
वैरिएबल-आर्टी केस (2 से अधिक तर्क) के लिए reduce
के संदर्भ में ही लागू किया गया है। दरअसल, यह किसी भी परिवर्तनीय-arity, सहयोगी फ़ंक्शन के लिए जाने के लिए बेहद समझदार "डिफ़ॉल्ट" तरीका प्रतीत होता है: reduce
में चीजों को गति देने के लिए कुछ अनुकूलन करने की क्षमता है - शायद internal-reduce
जैसे कुछ के माध्यम से, एक 1.2 नवीनता हाल ही में मास्टर में अक्षम , लेकिन आशा है कि भविष्य में फिर से पेश किया जाए - जो कि हर काम में दोहराने के लिए मूर्खतापूर्ण होगा जो वेरगास मामले में उनसे लाभ उठा सकता है। ऐसे सामान्य मामलों में, apply
बस थोड़ा ओवरहेड जोड़ देगा। (ध्यान दें कि इसके बारे में वास्तव में चिंतित होने के लिए कुछ भी नहीं है।)
दूसरी ओर, एक जटिल कार्य कुछ अनुकूलन अवसरों का लाभ उठा सकता है जो reduce
में निर्मित होने के लिए सामान्य नहीं हैं; तो apply
आपको उन लोगों का लाभ लेने देगा, जबकि reduce
वास्तव में आपको धीमा कर सकता है। अभ्यास में होने वाले बाद के परिदृश्य का एक अच्छा उदाहरण str
द्वारा प्रदान किया गया है: यह StringBuilder
आंतरिक रूप से उपयोग करता है और के बजाय apply
के उपयोग से महत्वपूर्ण रूप से लाभान्वित होगा।
तो, मैं संदेह में apply
का उपयोग कहूंगा; और यदि आपको पता है कि यह आपको reduce
से अधिक कुछ नहीं खरीद रहा है (और यह कि जल्द ही बदलने की संभावना नहीं है), तो reduce
का उपयोग करने के लिए स्वतंत्र महसूस करें, यदि आप इसे महसूस करते हैं तो उस कम अनावश्यक ओवरहेड को दाढ़ी दें।
स्रोत
2010-06-30 21:41:07
ग्रेट उत्तर। एक तरफ ध्यान दें, क्यों हैकेल में अंतर्निर्मित 'sum' फ़ंक्शन शामिल नहीं है? एक सुंदर आम ऑपरेशन की तरह लगता है। – dbyrne
धन्यवाद, यह सुनकर खुशी हुई! पुन: 'sum', मैं कहूंगा कि क्लोजर में यह फ़ंक्शन है, इसे' + 'कहा जाता है और आप इसे 'लागू' के साथ उपयोग कर सकते हैं। :-) गंभीरता से कहा जाए तो मुझे लगता है कि लिस्प में सामान्य रूप में, एक variadic समारोह प्रदान की जाती है, तो यह आम तौर पर एक आवरण संग्रह पर काम के साथ नहीं कर रहा है - कि क्या आप (या 'reduce' के लिए apply' का उपयोग', यदि आप जानते है जो अधिक समझ में आता है)। –
मजेदार, मेरी सलाह विपरीत है: संदेह होने पर 'कम करें', जब आप जानते हैं कि अनुकूलन है तो 'लागू करें'। 'Reduce' के अनुबंध और अधिक सटीक और इस प्रकार अधिक सामान्य अनुकूलन की संभावना है। 'Apply' अधिक अस्पष्ट है और इस प्रकार केवल एक मामला-दर-मामला आधार पर अनुकूलित किया जा सकता है। 'Str' और' concat' दो प्रचलित exceptons हैं। – cgrand