यह नक्शे और सिलवटों को समझाने में मदद करने के लिए एक पूरक उत्तर है। नीचे दिए गए उदाहरणों के लिए, मैं इस सूची का उपयोग करूंगा। याद रखें, यह सूची अपरिवर्तनीय है, इसलिए यह कभी नहीं बदलेगी:
var numbers = [1, 2, 3, 4, 5]
मैं अपने उदाहरणों में संख्याओं का उपयोग करूंगा क्योंकि वे आसानी से कोड को पढ़ते हैं। हालांकि याद रखें, सिलवटों का इस्तेमाल किसी भी चीज के लिए किया जा सकता है, जिसके लिए पारंपरिक लूप का इस्तेमाल किया जा सकता है।
एक नक्शा कुछ की एक सूची, और एक फ़ंक्शन लेता है, और एक सूची देता है जिसे फ़ंक्शन का उपयोग करके संशोधित किया गया था। प्रत्येक आइटम फ़ंक्शन को पास कर दिया जाता है, और फ़ंक्शन जो भी रिटर्न देता है वह बन जाता है।
इसका सबसे आसान उदाहरण एक सूची में प्रत्येक संख्या के लिए एक संख्या जोड़ रहा है। भाषा को अज्ञेय बनाने के लिए मैं छद्मकोश का उपयोग करूँगा:
function add-two(n):
return n + 2
var numbers2 =
map(add-two, numbers)
यदि आप प्रिंट करते हैं numbers2
, तो आप देखेंगे [3, 4, 5, 6, 7]
कि प्रत्येक तत्व में 2 जोड़ के साथ पहली सूची कौन सी है। सूचना का उपयोग add-two
करने के map
लिए फ़ंक्शन दिया गया था ।
गुना s समान हैं, फ़ंक्शन को छोड़कर आपको उन्हें 2 तर्क देने होंगे। पहला तर्क आमतौर पर संचायक (एक बाएं गुना में, जो सबसे आम हैं)। संचायक वह डेटा है जिसे लूप करते समय पास किया जाता है। दूसरा तर्क सूची का वर्तमान आइटम है; map
फ़ंक्शन के लिए बस ऊपर की तरह ।
function add-together(n1, n2):
return n1 + n2
var sum =
fold(add-together, 0, numbers)
यदि आप मुद्रित sum
करते हैं तो आपको संख्याओं की सूची का योग दिखाई देगा: 15।
यहाँ क्या करने के लिए तर्क दिए गए fold
हैं:
यह वह फ़ंक्शन है जिसे हम गुना दे रहे हैं। गुना फ़ंक्शन को वर्तमान संचायक, और सूची के वर्तमान आइटम को पारित करेगा। जो भी फ़ंक्शन रिटर्न देता है वह नया संचायक बन जाएगा, जो अगली बार फ़ंक्शन को पास किया जाएगा। जब आप FP- शैली को लूप कर रहे हैं तो यह "वैल्यू" याद है। मैंने इसे एक फ़ंक्शन दिया जो 2 नंबर लेता है और उन्हें जोड़ता है।
यह प्रारंभिक संचयकर्ता है; सूची में किसी भी आइटम को संसाधित करने से पहले संचायक क्या शुरू होता है। जब आप संख्याओं को जोड़ते हैं, तो इससे पहले कि आप किसी संख्या को एक साथ जोड़ते हैं, कुल क्या है? 0, जिसे मैंने दूसरे तर्क के रूप में पारित किया।
अंत में, नक्शे के साथ, हम इसे संसाधित करने के लिए संख्याओं की सूची में भी पास होते हैं।
यदि सिलवटों का अभी भी कोई मतलब नहीं है, तो इस पर विचार करें। जब आप लिखते हैं:
# Notice I passed the plus operator directly this time,
# instead of wrapping it in another function.
fold(+, 0, numbers)
आप मूल रूप से सूची में प्रत्येक आइटम के बीच पारित समारोह डाल रहे हैं, और या तो बाईं या दाईं ओर प्रारंभिक संचयकर्ता जोड़ रहे हैं (इस पर निर्भर करता है कि यह एक बाएं या दाएं गुना है), इसलिए:
[1, 2, 3, 4, 5]
हो जाता है:
0 + 1 + 2 + 3 + 4 + 5
^ Note the initial accumulator being added onto the left (for a left fold).
जो 15 के बराबर है।
एक का उपयोग करें map
जब आप किसी अन्य सूची में एक सूची चालू करने के लिए एक ही लंबाई की, चाहते हैं।
एक का उपयोग करें fold
जब आप एक एकल मूल्य में एक सूची चालू करने के लिए, नंबरों की सूची संक्षेप की तरह चाहते हैं।
जैसा कि @ जोर्ग ने टिप्पणियों में बताया, हालांकि, "एकल मूल्य" को एक नंबर की तरह कुछ सरल नहीं होना चाहिए; यह किसी भी एकल वस्तु हो सकती है, जिसमें एक सूची या एक टपल शामिल है! जिस तरह से मेरे पास वास्तव में फोल्ड क्लिक था, वह एक गुना के संदर्भ में एक मानचित्र को परिभाषित करना था । ध्यान दें कि संचायक एक सूची कैसे है:
function map(f, list):
fold(
function(xs, x): # xs is the list that has been processed so far
xs.add( f(x) ) # Add returns the list instead of mutating it
, [] # Before any of the list has been processed, we have an empty list
, list)
ईमानदारी से, एक बार जब आप प्रत्येक को समझते हैं, तो आपको एहसास होगा कि लगभग किसी भी लूपिंग को एक गुना या एक मानचित्र द्वारा प्रतिस्थापित किया जा सकता है।