Q32. What is currying in JavaScript?
একাধিক আর্গুমেন্টের ফাংশনকে একটি একটি করে ভাগ করা এবং এর সুবিধা।
Currying মানে এমন ফাংশন লেখা যেটি একসঙ্গে সব আর্গুমেন্ট নেয় না, বরং প্রতিবার একটি করে আর্গুমেন্ট নিয়ে ফেরত একটি নতুন ফাংশন দেয় — যতক্ষণ না সব আর্গুমেন্ট দেওয়া হয়, তারপর ফলত্র পাওয়া যায়।
// সাধারণ ফাংশন
function addThree(a, b, c) {
return a + b + c;
}
// curried সংস্করণ
function curriedAdd(a) {
return function (b) {
return function (c) {
return a + b + c;
};
};
}
curriedAdd(1)(2)(3); // 6ধাপে ধাপে — curriedAdd(1) ডাকলে a ধরে 1 হয় এবং একটি ফাংশন ফেরত হয়। সেই ফাংশনে (2) দিলে b ধরে 2 হয়, আরেকটি ফাংশন ফেরত হয়। সবশেষে (3) দিলে c = 3 বসে এবং 1 + 2 + 3 = 6 ফেরত হয়।
Arrow function ও rest operator ব্যবহার করলে অনেক ছোট ও পড়তে সহজ হয়।
const add = (a) => (b) => (c) => a + b + c;
console.log(add(1)(2)(3)); // 6
// map-এর সাথে দারুণ কাজ করে
const users = [
{ name: "Rahim", age: 25 },
{ name: "Karim", age: 30 },
];
const getName = (obj) => obj.name;
console.log(users.map((user) => getName(user))); // ["Rahim", "Karim"]সবচেয়ে বড় সুবিধা হলো আংশিকভাবে ফাংশন তৈরি করে রাখা যায় — বাকি আর্গুমেন্ট পরে দেওয়া হয়। এটাই currying-এর মূল শক্তি।
function greet(greeting) {
return function (name) {
return greeting + ", " + name + "!";
};
}
// শুধু অংশটা তৈরি, পরে ব্যবহার
const hello = greet("হ্যালো");
const goodMorning = greet("সুপ্রভাত");
console.log(hello("Rahim")); // "হ্যালো, Rahim!"
console.log(goodMorning("Karim")); // "সুপ্রভাত, Karim!"// লজিক আলাদা করা
const withTax = (rate) => (price) => price * (1 + rate);
const withDiscount = (rate) => (price) => price * (1 - rate);
console.log(withTax(0.1)(100)); // 110.00000000000001
console.log(withDiscount(0.2)(100)); // 80| বিষয় | Currying | Partial application |
|---|---|---|
| কতবার ভাগ | সবসময় একটি করে | যেকোনো সংখ্যক |
| শেষ ফল | ফাংশন না থেকে সরাসরি মান | ফাংশনই ফেরত হয় |
| উদাহরণ | add(1)(2)(3) | add(1, 2) → ফাংশন |
currying-এর ফলে বারবার ফাংশন তৈরি হয়, তাই খুব ঘন ঘন ডাকা হলে সামান্য ধীর হতে পারে। আর map বা filter-এর মতো অনেক ডেটা থাকলে সাধারণ এক লাইনের ফাংশনই পরিষ্কার থাকে।