📘 CodingMarble Learn

फ़ंक्शनल प्रोग्रामिंग: फ़ंक्शन, map, filter और fold

फ़ंक्शनल प्रोग्रामिंग में प्रोग्राम फ़ंक्शनों से बनता है। फ़ंक्शन अपने प्रांत (domain) के हर इनपुट को सह-प्रांत (co-domain) के एक आउटपुट से जोड़ता है; इसका type f: A → B लिखते हैं। शुद्ध (pure) फ़ंक्शन एक ही इनपुट पर वही आउटपुट देता है और बाहर कुछ नहीं बदलता (कोई side effect नहीं); डेटा अपरिवर्तनीय (immutable) रहता है। फ़ंक्शन first-class हैं: नाम दिया जा सकता है, दूसरे को दिया और लौटाया जा सकता है। Partial application में फ़ंक्शन को कुछ इनपुट देकर नया फ़ंक्शन मिलता है। Composition g ∘ f में पहले f, फिर g चलता है। Higher-order फ़ंक्शन: map हर सदस्य पर फ़ंक्शन लगाता है, filter जाँच में पास सदस्य रखता है, fold (reduce) पूरी सूची को एक मान बना देता है। सूची = head (पहला सदस्य) + tail (बाक़ी)।

🎬 कदम-दर-कदम कहानी

  1. फ़ंक्शन एक मशीन है। square में 3 डालो, 9 निकलता है। इसका type है integer → integer: प्रांत और सह-प्रांत।
  2. add को सिर्फ़ एक इनपुट 5 दो। एक नया फ़ंक्शन add5 मिलता है। यही partial application है। फ़ंक्शन भी मान हैं।
  3. दो मशीनें जोड़ो: पहले 1 जोड़ो, फिर दुगना करो। 3 बना 4, फिर 8। यह composition है, g ∘ f।
  4. map सूची के हर सदस्य का वर्ग करता है। filter सिर्फ़ सम संख्याएँ रखता है। पुरानी सूची नहीं बदलती।
  5. सूची = head + tail। fold हर सदस्य जोड़कर एक कुल बनाता है: 1 + 2 + … + 6 = 21।
  6. अब आपकी बारी: map, filter या fold चुनिए, सूची की लंबाई बदलिए, और दबाने से पहले उत्तर का अनुमान लगाइए।

टिप: 3D दृश्य को घुमाने के लिए खींचें। ज़ूम के लिए दो उंगलियाँ इस्तेमाल करें।

🤔 आम शंकाएँ और उनके जवाब

क्या फ़ंक्शन और Python का procedure एक ही है?

हमेशा नहीं। गणितीय फ़ंक्शन एक मान लौटाता है और कुछ नहीं बदलता; procedure print या चर बदल सकता है। चरण 1 में शुद्ध मशीन है।

फ़ंक्शन दूसरा फ़ंक्शन कैसे लौटा सकता है?

add को सिर्फ़ पहला इनपुट दें तो वह add5 लौटाता है, जो दूसरे इनपुट का इंतज़ार करता है। चरण 2 देखिए।

g ∘ f में पहले कौन चलता है?

पहले f, फिर g। चरण 3 में गेंद पहले नीली f मशीन से गुज़रती है।

क्या map पुरानी सूची बदल देता है?

नहीं। नीली पंक्ति वैसी रहती है; नई हरी पंक्ति बनती है। चरण 4।

एक सदस्य वाली सूची का tail क्या है?

ख़ाली सूची []। tail हमेशा सूची होती है। चरण 5।

fold को शुरुआती मान क्यों चाहिए?

ख़ाली सूची का उत्तर यही है और कुल यहीं से बढ़ता है। चरण 6 में लंबाई 1 रखकर fold आज़माइए।

फ़ंक्शनल पैराडाइम क्या है?

प्रोग्रामिंग पैराडाइम प्रोग्राम लिखने की एक शैली है। इम्पेरेटिव प्रोग्राम में आप चरण-दर-चरण आदेश देते हैं जो चर (variable) बदलते हैं। फ़ंक्शनल प्रोग्राम में उत्तर को डेटा पर लगाए गए फ़ंक्शनों के रूप में लिखते हैं।

फ़ंक्शन, प्रांत और सह-प्रांत

फ़ंक्शन हर इनपुट को ठीक एक आउटपुट से जोड़ता है। मान्य इनपुटों का समुच्चय प्रांत (domain) है। जिस समुच्चय से आउटपुट आते हैं, वह सह-प्रांत (co-domain) है। फ़ंक्शन type लिखते हैं f: A → B।

उदाहरण: isEven: integer → Boolean। प्रांत = पूर्णांक, सह-प्रांत = {True, False}।

शुद्ध फ़ंक्शन, कोई side effect नहीं

फ़ायदा: कोड जाँचना और सही साबित करना आसान, और कई प्रोसेसरों पर एक साथ चलाना सुरक्षित।

First-class फ़ंक्शन, partial application और composition

First-class फ़ंक्शन

फ़ंक्शन first-class है जब उसे किसी भी मान की तरह इस्तेमाल किया जा सके: नाम देना, argument में देना, नतीजे में लौटाना, सूची में रखना।

Higher-order फ़ंक्शन

जो फ़ंक्शन किसी फ़ंक्शन को argument में ले या लौटाए, वह higher-order है। map, filter, fold ऐसे ही हैं।

Partial application (आंशिक अनुप्रयोग)

add x y = x + y का type integer → (integer → integer) मानिए। सिर्फ़ 5 देने पर नया फ़ंक्शन add5 = add 5 मिलता है, type integer → integer। फिर add5 2 = 7।

Composition (संयोजन)

g ∘ f का अर्थ: पहले f, फिर g: (g ∘ f) x = g(f(x))। अगर f: A → B और g: B → C तो g ∘ f: A → C। f का सह-प्रांत g के प्रांत से मेल खाना चाहिए। क्रम मायने रखता है।

सूची: head, tail और सूची संक्रियाएँ

फ़ंक्शनल भाषाओं में सूची या तो ख़ाली [] होती है, या एक head (पहला सदस्य) जो tail (बाक़ी सदस्यों की सूची) से जुड़ा है।

सूची head + tail है, इसलिए कई फ़ंक्शन रिकर्शन से लिखे जाते हैं: head के साथ कुछ करो, फिर tail पर वही फ़ंक्शन, और ख़ाली सूची पर रुको।

total [] = 0
total (x:xs) = x + total xs

map, filter और fold (reduce)

इन्हें जोड़ सकते हैं: [1..6] की सम संख्याओं के वर्गों का योग = fold (+) 0 (map (^2) (filter even [1..6])) = 4 + 16 + 36 = 56।

करके देखें

आख़िरी 3D चरण में map, filter या fold चुनिए और सूची की लंबाई खिसकाइए। पहले ज़ोर से अनुमान बोलिए। फिर Python में आज़माइए: list(map(lambda x: x*3, [1,2,3])), list(filter(lambda x: x%2, [1,2,3,4])) और functools.reduce(lambda a,b: a+b, [1,2,3], 0)।

मुख्य सूत्र और परिभाषाएँ

हल किए गए उदाहरण

1. isEven (पूर्णांक सम है या नहीं) का type, प्रांत और सह-प्रांत बताइए।

isEven: integer → Boolean। प्रांत = पूर्णांक। सह-प्रांत = {True, False}।

2. f x = x + 3 और g x = x × 2। (g ∘ f) 4 और (f ∘ g) 4 निकालिए।

(g ∘ f) 4 = g(7) = 14। (f ∘ g) 4 = f(8) = 11। उत्तर अलग, यानी क्रम मायने रखता है।

3. mult x y = x × y। triple = mult 3 क्या है, और triple 5 कितना?

mult 3 आंशिक रूप से लगाया फ़ंक्शन है जो y का इंतज़ार करता है; triple: integer → integer। triple 5 = 15।

4. head (tail [8, 3, 6, 1]) निकालिए।

tail [8,3,6,1] = [3,6,1]; head [3,6,1] = 3।

5. map (+1) (filter odd [1,2,3,4,5]) निकालिए।

filter odd से [1,3,5]; map (+1) से [2,4,6]।

6. left fold में fold (−) 20 [5, 3, 2] निकालिए, और map व fold से [1,2,3] के वर्गों का योग।

Left fold: ((20−5)−3)−2 = 10। वर्गों का योग: map (^2) [1,2,3] = [1,4,9]; fold (+) 0 [1,4,9] = 14।

आम गलतियाँ

अभ्यास क्विज़

1. कौन-सा फ़ंक्शन इनपुट जितनी ही लंबी सूची लौटाता है?
2. tail [5, 9, 2] है:
3. जो फ़ंक्शन किसी फ़ंक्शन को argument में ले, वह कहलाता है:
4. f x = x × x और g x = x − 1 हो तो (g ∘ f) 3 =
5. fold (+) 0 [2, 4, 6] =

अभ्यास: खुद जवाब दो

अपना जवाब लिखो या चुनो, फिर जाँचें दबाओ। अटको तो संकेत देखो; जवाब देने के बाद पूरा हल दिखेगा।

अक्सर पूछे जाने वाले प्रश्न

फ़ंक्शनल प्रोग्रामिंग आसान शब्दों में क्या है?

प्रोग्रामिंग का वह तरीक़ा जिसमें शुद्ध फ़ंक्शनों को जोड़कर उत्तर बनाते हैं, बिना चर या डेटा बदले।

map, filter और reduce में क्या अंतर है?

map हर सदस्य बदलता है, filter जाँच में फ़ेल सदस्य हटाता है, reduce (fold) सबको एक मान में मिलाता है।

Partial application क्या है?

फ़ंक्शन को ज़रूरत से कम arguments देना, जिससे बाक़ी का इंतज़ार करता नया फ़ंक्शन मिलता है, जैसे add 5 से add5।

यह कहाँ पढ़ाया जाता है

इंग्लैंडYear 134.12 Fundamentals of functional programming

पहले यह पढ़ें

आगे पढ़ें

इससे जुड़े पाठ

सभी कंप्यूटर विज्ञान पाठ