उन्नत स्तर पर कार्यात्मक प्रोग्रामिंग का परिचय
\n\nकार्यात्मक प्रोग्रामिंग (FP) एक प्रतिमान है जो गणनाओं को गणितीय फ़ंक्शनों के निष्पादन के रूप में मानता है और अवस्था में परिवर्तन तथा परिवर्तनीय डेटा से बचता है। JavaScript में, विशेष रूप से Node.js वातावरण में, FP अपनी पूर्वानुमेयता, परीक्षणीयता और समानांतरता के कारण तेजी से लोकप्रिय हो रहा है।
\n\nयदि आपने FP की मूल बातें (शुद्ध फ़ंक्शन, उच्च-क्रम फ़ंक्शन, map, filter, reduce) पहले ही सीख ली हैं, तो अब अगले स्तर पर जाने का समय है। इस लेख में हम उन्नत अवधारणाओं पर चर्चा करेंगे: करीइंग, कम्पोज़ीशन, मोनाड और इम्यूटेबल डेटा के साथ कार्य करना।
1. करीइंग और आंशिक अनुप्रयोग
\n\nकरीइंग क्या है?
\nकरीइंग एक ऐसी प्रक्रिया है जो एक फ़ंक्शन को, जो कई तर्क लेता है, फ़ंक्शनों के अनुक्रम में बदल देती है, जिनमें से प्रत्येक एक तर्क लेता है। यह सामान्य फ़ंक्शनों के आधार पर विशिष्ट फ़ंक्शन बनाने की अनुमति देता है।
\n\n// सामान्य फ़ंक्शन\nconst add = (a, b, c) => a + b + c;\nconsole.log(add(1, 2, 3)); // 6\n\n// करीड संस्करण\nconst curriedAdd = a => b => c => a + b + c;\nconsole.log(curriedAdd(1)(2)(3)); // 6\n\n// सार्वभौमिक करीइंग फ़ंक्शन\nconst curry = (fn) => {\n const arity = fn.length;\n const resolver = (...args) => {\n if (args.length < arity) {\n return (...nextArgs) => resolver(...args, ...nextArgs);\n }\n return fn(...args);\n };\n return resolver;\n};\n\nconst multiply = (a, b, c) => a * b * c;\nconst curriedMultiply = curry(multiply);\nconsole.log(curriedMultiply(2)(3)(4)); // 24\nconsole.log(curriedMultiply(2, 3)(4)); // 24\n\nआंशिक अनुप्रयोग
\nआंशिक अनुप्रयोग एक फ़ंक्शन के कुछ तर्कों को स्थिर करने की प्रक्रिया है, जिससे कम तर्कों वाला एक नया फ़ंक्शन बनता है। करीइंग के विपरीत, आंशिक अनुप्रयोग में कॉल का सख्त क्रम आवश्यक नहीं है।
\n\nconst partial = (fn, ...presetArgs) => (...laterArgs) => fn(...presetArgs, ...laterArgs);\n\nconst greet = (greeting, name) => `${greeting}, ${name}!`;\nconst sayHello = partial(greet, 'Hello');\nconst sayHi = partial(greet, 'Hi');\n\nconsole.log(sayHello('Alice')); // Hello, Alice!\nconsole.log(sayHi('Bob')); // Hi, Bob!\n\n2. फ़ंक्शन कम्पोज़ीशन
\n\nउन्नत कम्पोज़ीशन
\nकम्पोज़ीशन एक नया फ़ंक्शन बनाने के लिए कई फ़ंक्शनों को संयोजित करने की प्रक्रिया है। उन्नत FP में हम दाएँ से बाएँ कम्पोज़ीशन (compose) और बाएँ से दाएँ कम्पोज़ीशन (pipe) का उपयोग करते हैं।
// सरल कम्पोज़ीशन (दाएँ से बाएँ)\nconst compose = (...fns) => (value) => fns.reduceRight((acc, fn) => fn(acc), value);\n\n// बाएँ से दाएँ कम्पोज़ीशन (pipe)\nconst pipe = (...fns) => (value) => fns.reduce((acc, fn) => fn(acc), value);\n\n// उदाहरण: स्ट्रिंग प्रसंस्करण\nconst trim = (str) => str.trim();\nconst toLowerCase = (str) => str.toLowerCase();\nconst capitalize = (str) => str.charAt(0).toUpperCase() + str.slice(1);\nconst removeSpaces = (str) => str.replace(/\\s+/g, '-');\n\nconst slugify = compose(capitalize, toLowerCase, trim, removeSpaces);\n// समतुल्य: removeSpaces(trim(toLowerCase(capitalize(" Hello World "))))\n\nconsole.log(slugify(' Hello World ')); // Hello-world\n\nट्रांसड्यूसर (Transducers)
\nट्रांसड्यूसर परिवर्तन फ़ंक्शनों का कम्पोज़ीशन हैं जो किसी भी पुनरावृत्त डेटा संरचना पर काम करते हैं। वे कई संक्रियाओं (जैसे map और filter) को एक ही पास में संयोजित करने की अनुमति देते हैं।
const transducer = (mapper, predicate) => (reducer) => (acc, value) => {\n const mapped = mapper(value);\n return predicate(mapped) ? reducer(acc, mapped) : acc;\n};\n\nconst double = (x) => x * 2;\nconst isEven = (x) => x % 2 === 0;\n\nconst processNumbers = transducer(double, isEven);\nconst sumReduc