Currying হল একটি ফাংশনাল প্রোগ্রামিং ধারণা যা একটি ফাংশনকে এমনভাবে রূপান্তর করে যাতে এটি একে একে একাধিক আর্গুমেন্ট নেয়ার পরিবর্তে একাধিক ফাংশন রিটার্ন করে। এটি মূলত Higher-order function এবং Partial application এর সাথে সম্পর্কিত। Currying, একটি ফাংশনকে একাধিক ফাংশনে বিভক্ত করে, যেখানে প্রথম ফাংশন একক আর্গুমেন্ট নেয় এবং পরবর্তী ফাংশনটি পরবর্তী আর্গুমেন্ট গ্রহণ করে।
Currying এর ধারণা
Currying হল এমন একটি কৌশল যেখানে আপনি একটি ফাংশনকে একাধিক আর্গুমেন্টের পরিবর্তে এক এক করে আর্গুমেন্ট পাস করার জন্য নতুন ফাংশন তৈরি করেন। এতে, একটি ফাংশন প্রথমে আর্গুমেন্টের একটি অংশ গ্রহণ করে এবং তখন তা রিটার্ন করে পরবর্তী ফাংশনকে, যা বাকি আর্গুমেন্ট গ্রহণ করে এবং শেষে মূল কাজটি সম্পাদন করে।
Currying এর উদাহরণ:
ধরা যাক, আমাদের একটি ফাংশন রয়েছে যা দুটি সংখ্যা যোগ করবে:
// Normal Function: Adds two numbers
public int add(int a, int b) {
return a + b;
}
এখন, Currying এর মাধ্যমে, আমরা এই ফাংশনটিকে এমনভাবে রূপান্তর করতে পারি যেন এটি এক এক করে আর্গুমেন্ট নেয়:
// Curried function
public Function<Integer, Function<Integer, Integer>> curriedAdd() {
return (a) -> (b) -> a + b;
}
এখানে curriedAdd() প্রথমে একটি ফাংশন রিটার্ন করে যা একটি ইনপুট নেয় (যেমন, a), এবং এই ফাংশনটি আবার একটি নতুন ফাংশন রিটার্ন করে যা দ্বিতীয় ইনপুট (b) নেয় এবং শেষে a + b রিটার্ন করে।
ব্যবহার:
public class Main {
public static void main(String[] args) {
Function<Integer, Function<Integer, Integer>> add = curriedAdd();
// Apply first argument
Function<Integer, Integer> addWith5 = add.apply(5);
// Apply second argument and get result
int result = addWith5.apply(3);
System.out.println(result); // Output: 8
}
}
এখানে, আমরা প্রথমে 5 পাস করেছি, যা একটি নতুন ফাংশন রিটার্ন করেছে যেটি পরবর্তী আর্গুমেন্ট নেয়। এরপর, আমরা 3 পাস করে চূড়ান্ত যোগফল 8 পেয়েছি।
Currying এর প্রয়োজনীয়তা:
Currying-এর মূল উদ্দেশ্য এবং প্রয়োজনীয়তা হল ফাংশন কম্পোজিশন এবং partial application এর মাধ্যমে কোড পুনঃব্যবহারযোগ্যতা এবং জটিলতা কমানো। এটি ফাংশনাল প্রোগ্রামিং-এর একটি গুরুত্বপূর্ণ কৌশল, যা কিছু বিশেষ কারণে ব্যবহৃত হয়:
Partial Application:
- Currying আপনাকে partial application এর সুবিধা দেয়। এটি এমন একটি প্রক্রিয়া যেখানে আপনি একটি ফাংশনের কিছু আর্গুমেন্ট আগে থেকেই প্রদান করতে পারেন, এবং বাকি আর্গুমেন্টগুলি পরে প্রদান করতে পারেন। এর মাধ্যমে আপনি একই ফাংশনকে বিভিন্ন আর্গুমেন্ট দিয়ে পুনঃব্যবহার করতে পারেন।
উদাহরণ:
Function<Integer, Function<Integer, Integer>> add = a -> b -> a + b; // Partial application: Fix one argument Function<Integer, Integer> add5 = add.apply(5); // Function that adds 5 to any number System.out.println(add5.apply(10)); // Output: 15Higher-order Functions:
- Currying ফাংশনাল প্রোগ্রামিংয়ের একটি মৌলিক অংশ, কারণ এটি higher-order functions তৈরি করতে সাহায্য করে, যেখানে ফাংশন অন্য ফাংশনকে আর্গুমেন্ট হিসেবে গ্রহণ করে বা রিটার্ন করে। এটি কোডকে আরও মডুলার এবং পুনঃব্যবহারযোগ্য করে তোলে।
উদাহরণ:
public static Function<Integer, Function<Integer, Integer>> multiply = a -> b -> a * b;এখানে,
multiplyএকটি higher-order function যা দুটি সংখ্যার গুণফল বের করে। আমরা প্রথম আর্গুমেন্টটি প্রদান করতে পারি এবং পরবর্তী সময়ে দ্বিতীয় আর্গুমেন্ট দিয়ে গুণফল বের করতে পারব।- Readable and Modular Code:
- Currying কোডের পাঠযোগ্যতা এবং মডুলারিটি উন্নত করতে সাহায্য করে। আপনি ছোট ছোট ফাংশন তৈরি করতে পারেন, যা একটি নির্দিষ্ট কাজ একা একা করতে পারে, এবং পরে এগুলোকে একত্রিত করে আরও জটিল কার্যকলাপ তৈরি করা যায়।
- Flexibility:
- Currying ভিন্ন ভিন্ন ধরনের ফাংশনাল কম্পোজিশনের মাধ্যমে কোডের পুনঃব্যবহারযোগ্যতা বৃদ্ধি করে। একাধিক আর্গুমেন্টের জন্য একাধিক ধাপ গ্রহণ করে এই প্যাটার্নটি ফাংশনকে আরো নমনীয় করে তোলে।
Currying-এর প্রয়োজনীয়তা Java তে
Java-তে, যদিও Currying নেটিভভাবে সমর্থিত নয় (Java একটি স্টেটিক টাইপিং ল্যাঙ্গুয়েজ), তবে Java 8 এবং পরবর্তী সংস্করণে lambda expressions এবং higher-order functions ব্যবহারের মাধ্যমে Currying-এর ধারণা বাস্তবায়ন করা সম্ভব হয়েছে।
Java Streams বা functional interfaces এর মাধ্যমে Currying-এর ধারণাকে কার্যকরভাবে প্রয়োগ করা যায়। এটি code reusability, functional composition, এবং lazy evaluation সহ আরো অনেক সুবিধা প্রদান করে।
Currying হল একটি গুরুত্বপূর্ণ ফাংশনাল প্রোগ্রামিং কৌশল যা ফাংশনগুলিকে ছোট ছোট অংশে বিভক্ত করে, এবং এর মাধ্যমে partial application, higher-order functions, এবং functional composition সম্ভব হয়। Java 8-এ lambda expressions এবং functional interfaces ব্যবহারের মাধ্যমে Currying-এর ধারণা বাস্তবায়ন করা সম্ভব হয়েছে, যা কোডের পুনঃব্যবহারযোগ্যতা, পাঠযোগ্যতা, এবং নমনীয়তা বৃদ্ধি করে। Currying ফাংশনাল প্রোগ্রামিংয়ের একটি শক্তিশালী টুল, যা কোডের ভেতর ফাংশনগুলোর মধ্যকার সম্পর্ক এবং আচরণ স্পষ্ট করতে সাহায্য করে।
Read more