2009-08-27 29 views
6

विकिपीडिया पृष्ठ पर summation पर यह कहता है कि हैस्केल में समकक्ष ऑपरेशन फ़ोल्ड का उपयोग करना है। मेरा सवाल है: क्या योग के बजाय इसका उपयोग करने का कोई कारण है? क्या दूसरे की तुलना में एक और 'शुद्ध' है, या कोई वास्तविक अंतर नहीं है?हास्केल में सम्मेलन नोटेशन

उत्तर

11

foldl एक सामान्य tail-recursive फ़ंक्शन को कम करता है। रिकर्सन एक कार्यात्मक प्रोग्रामिंग भाषाओं में वस्तुओं की सूचियों में हेरफेर करने के बारे में सोचने का सामान्य तरीका है, और लूप पुनरावृत्ति के लिए एक विकल्प प्रदान करता है जो अक्सर अधिक सुरुचिपूर्ण होता है। fold जैसे कम कार्यों के मामले में, पूंछ-पुनरावर्ती कार्यान्वयन is very efficient। जैसा कि अन्य ने समझाया है, sum तो foldl (+) 0 l के लिए बस एक सुविधाजनक निमोनिक है।

संभावित रूप से विकिपीडिया पृष्ठ पर इसका उपयोग पूंछ-रिकर्सन के माध्यम से सारांश के सामान्य सिद्धांत को चित्रित करना है। लेकिन चूंकि हास्केल Prelude लाइब्रेरी में sum है, जो समझने के लिए छोटा और अधिक स्पष्ट है, तो आपको इसे अपने कोड में उपयोग करना चाहिए।

हास्केल के fold कार्यों का एक nice discussion सरल उदाहरणों के साथ काम करता है जो पढ़ने योग्य है।

3

मुझे नहीं लगता कि यह उस विकिपीडिया पृष्ठ पर हास्केल या foldl के बारे में कुछ कहां कहता है, लेकिन sum हास्केल में foldl का एक और विशिष्ट मामला है। यह इस तरह से लागू किया जा सकता है, उदाहरण के लिए:

sum l = foldl (+) 0 l 

कौन सा कम किया जा सकता:

sum = foldl (+) 0 
+0

आह, अब मैं इसे देखता हूं। मैंने 'फ़ोल्ड' की खोज की है लेकिन विकिपीडिया पेज 'फोल्ड' का उपयोग करता है। –

0

वहाँ कोई अंतर नहीं है। वह पृष्ठ बस यह कह रहा है कि sumfoldl का उपयोग करके कार्यान्वित किया गया है। जब भी आपको संख्याओं की सूची की गणना करने की आवश्यकता होती है तो बस sum का उपयोग करें।

1

जैसा कि दूसरों ने कहा है, इसमें कोई अंतर नहीं है। हालांकि, एक फोल्ड-कॉल की तुलना में एक योग-कॉल पढ़ने के लिए आसान है, इसलिए यदि आपको सारांश की आवश्यकता है तो मैं योग के लिए जाऊंगा।

2

ध्यान देने योग्य एक बात यह है कि योग आपके इच्छित से अधिक आलसी हो सकता है, इसलिए फ़ोल्ड का उपयोग करने पर विचार करें।

0

सारांश की अवधारणा को गैर-संख्यात्मक प्रकारों तक बढ़ाया जा सकता है: आपको केवल एक (+) ऑपरेशन और शून्य मान के बराबर कुछ चाहिए। दूसरे शब्दों में, आपको monoid की आवश्यकता है। इससे हास्केल फ़ंक्शन "mconcat" होता है, जो एक मोनॉयड प्रकार के मानों की एक सूची का योग देता है। पाठ्यक्रम का डिफ़ॉल्ट "mconcat" "mappend" के संदर्भ में परिभाषित किया गया है जो प्लस ऑपरेशन है।

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