কারিং (Currying) এবং আংশিক ফাংশন (Partial Functions) স্কালার ফাংশনাল প্রোগ্রামিংয়ের দুটি গুরুত্বপূর্ণ বৈশিষ্ট্য। এগুলি কোডে ফাংশনগুলির ব্যবহারকে আরও শক্তিশালী এবং নমনীয় করে তোলে। নিচে এই দুটি বৈশিষ্ট্য সম্পর্কে বিস্তারিত আলোচনা করা হল।
১. কারিং (Currying)
কারিং হল একটি ফাংশনাল প্রোগ্রামিং কৌশল যেখানে একটি ফাংশনকে একাধিক আর্গুমেন্টের পরিবর্তে এক এক করে আর্গুমেন্ট গ্রহণকারী ফাংশনগুলির সিকোয়েন্সে ভেঙে দেওয়া হয়। সহজভাবে বলতে গেলে, কারিং হলো এমন একটি প্রক্রিয়া, যেখানে একাধিক আর্গুমেন্টের ফাংশনকে একের পর এক আর্গুমেন্ট গ্রহণকারী ফাংশনে বিভক্ত করা হয়।
উদাহরণ:
ধরা যাক, আমাদের একটি সাধারণ ফাংশন রয়েছে যা দুটি আর্গুমেন্ট নেয় এবং তাদের যোগফল দেয়:
object CurryingExample {
def add(a: Int, b: Int): Int = a + b
def main(args: Array[String]): Unit = {
println(add(2, 3)) // Output: 5
}
}এখন, যদি আমরা এই ফাংশনটিকে কারিং করতে চাই, তাহলে এটি কিছুটা ভিন্নভাবে লেখা হবে:
object CurryingExample {
def add(a: Int)(b: Int): Int = a + b
def main(args: Array[String]): Unit = {
val add2 = add(2)_ // Partially applied function
println(add2(3)) // Output: 5
}
}এখানে:
add(a: Int)(b: Int): এখানে আমরা দুটি আর্গুমেন্টের জন্য আলাদা ফাংশন ব্যবহার করছি। প্রথম ফাংশনaনেয় এবং দ্বিতীয় ফাংশনbনেয়।add(2)_: এটি আংশিকভাবে প্রয়োগিত ফাংশন, যেখানে প্রথম আর্গুমেন্ট2পাঠানো হয়েছে। পরে আমরা অন্য একটি ফাংশন কল দিয়ে দ্বিতীয় আর্গুমেন্ট পাঠাতে পারি।
কারিং এর সুবিধা:
- কোড পুনঃব্যবহারযোগ্যতা: একবার একটি আর্গুমেন্ট প্রদান করার পর সেই আর্গুমেন্টের সাথে অন্যান্য আর্গুমেন্টের জন্য পুনরায় ফাংশন ব্যবহার করা সম্ভব।
- ফাংশনাল কম্পোজিশন: কারিং আমাদের ফাংশনগুলোকে আরও ছোট এবং সহজে পুনরায় ব্যবহারযোগ্য করে তোলে।
২. আংশিক ফাংশন (Partial Function)
আংশিক ফাংশন এমন একটি ফাংশন যা তার ডিফাইন করা কিছু ইনপুট মানের জন্য কাজ করে, কিন্তু সমস্ত ইনপুটের জন্য এটি কাজ নাও করতে পারে। স্কালায়, আংশিক ফাংশন সাধারণত isDefinedAt পদ্ধতিটি দিয়ে চিহ্নিত করা হয়, যা বলে দেয় ফাংশনটি কোন মানের জন্য সংজ্ঞায়িত।
উদাহরণ:
ধরা যাক, একটি ফাংশন আছে যা শুধুমাত্র পজিটিভ সংখ্যাগুলির উপর কাজ করবে:
object PartialFunctionExample {
val positive: PartialFunction[Int, String] = {
case x if x > 0 => "Positive"
}
def main(args: Array[String]): Unit = {
println(positive(5)) // Output: Positive
// Uncommenting the next line will cause a MatchError since the function is not defined for negative values
// println(positive(-1))
}
}এখানে:
PartialFunction[Int, String]: এই অংশিক ফাংশনটি শুধুমাত্রIntটাইপের পজিটিভ সংখ্যাগুলির জন্য কাজ করবে এবং তার রিটার্ন টাইপ হবেString।case x if x > 0 => "Positive": এখানেcaseব্লক ব্যবহার করা হয়েছে, যাxএর মান পজিটিভ হলে "Positive" রিটার্ন করবে।
আংশিক ফাংশন এর সুবিধা:
- বিশেষ ইনপুটের জন্য কোড লেখা: আপনি শুধুমাত্র কিছু ইনপুটের জন্য কাজ করা ফাংশন তৈরি করতে পারেন, এবং অন্য ইনপুটগুলির জন্য এটি কাজ করবে না। এটি আরও নমনীয় এবং সুনির্দিষ্ট ফাংশন তৈরি করতে সহায়তা করে।
- একটি বড় ফাংশনকে ছোট ছোট অংশে বিভক্ত করা: আংশিক ফাংশন বিভিন্ন ছোট ছোট অংশে কাজ করতে সহায়তা করে এবং তারপর এগুলিকে একত্রিত করা যায়।
৩. কারিং এবং আংশিক ফাংশনের পার্থক্য
| বৈশিষ্ট্য | কারিং (Currying) | আংশিক ফাংশন (Partial Function) |
|---|---|---|
| সংজ্ঞায়ন | একাধিক আর্গুমেন্টের জন্য একাধিক ফাংশনে বিভক্ত করা | কিছু ইনপুটের জন্য সংজ্ঞায়িত ফাংশন |
| ব্যবহার | একাধিক আর্গুমেন্টের জন্য আর্গুমেন্টগুলি আলাদা আলাদা করে প্রদান করা | শুধুমাত্র নির্দিষ্ট ইনপুটগুলির জন্য ফাংশন প্রয়োগ করা |
| নমনীয়তা | ফাংশনগুলিকে আরও নমনীয় এবং পুনঃব্যবহারযোগ্য করে তোলে | শুধুমাত্র নির্বাচিত ইনপুটগুলির জন্য কাজ করা |
| ফাংশনাল প্রোগ্রামিং | ফাংশনাল প্রোগ্রামিংয়ে কম্পোজিশন সহজ করে | আংশিকভাবে প্রয়োগিত ফাংশন তৈরি করে |
সারাংশ
- কারিং (Currying) হল একটি কৌশল, যেখানে একাধিক আর্গুমেন্টের ফাংশনকে একের পর এক আর্গুমেন্ট গ্রহণকারী ফাংশনে বিভক্ত করা হয়। এটি কোডের পুনঃব্যবহারযোগ্যতা এবং কম্পোজিশন বাড়ায়।
- আংশিক ফাংশন (Partial Function) হল একটি ফাংশন যা কিছু ইনপুটের জন্য কাজ করে, তবে সব ইনপুটের জন্য নয়। এটি ফাংশনকে আরো সুনির্দিষ্ট করে তোলে এবং ফাংশনাল প্রোগ্রামিংয়ের আরও নমনীয়তা প্রদান করে।
এই দুটি ফিচার ফাংশনাল প্রোগ্রামিংয়ে কাজ করার সময় অত্যন্ত সহায়ক হতে পারে এবং স্কালার কোডকে আরও শক্তিশালী, কার্যকরী ও সংক্ষিপ্ত করে তোলে।
Read more