মোনাডস এবং অ্যাপ্লিকেটিভস ফাংশনাল প্রোগ্রামিংয়ের গুরুত্বপূর্ণ কনসেপ্ট যা স্কালায় ব্যবহৃত হয়। এগুলি সাধারণত লজিকাল টাইপ এবং ডেটা ট্রান্সফরমেশন ব্যবস্থাপনাতে ব্যবহৃত হয়, বিশেষত একাধিক স্টেপে বা অ্যাসিঙ্ক্রোনাস প্রোগ্রামিংয়ে। স্কালায় এগুলি কিভাবে কাজ করে, তা নিচে বিস্তারিতভাবে আলোচনা করা হলো।
১. মোনাডস (Monads) in Scala
মোনাড হল এমন একটি ফাংশনাল কনসেপ্ট যা একটি টাইপ এবং দুটি নির্দিষ্ট অপারেশন নিয়ে কাজ করে:
flatMap: যা একটি নতুনMonadতৈরি করে।map: যা কোনো ফাংশন প্রয়োগ করেMonadএর ভিতরের ভ্যালু পরিবর্তন করে।
মোনাড ব্যবহৃত হয় তখন যখন আমাদের কোনো টাইপের উপর কাজ করার জন্য একাধিক স্টেপের প্রয়োজন হয়, এবং প্রতিটি স্টেপের ফলাফলকে একটি Monad এর মধ্যে রাখতে হয়।
১.১ মোনাডের মৌলিক কাঠামো
মোনাড একটি টাইপের উপর কাজ করে এবং বক্সিং (wrapping) এবং আনবক্সিং (unwrapping) এর মতো কাজগুলো সম্পাদন করতে সাহায্য করে। মোনাডের প্রধান দুটি মেথড হলো:
map: এটি মোনাডের ভিতরের মানকে পরিবর্তন করে।flatMap: এটি মোনাডের ভিতরের মানকে বের করে একটি নতুন মোনাড তৈরি করে।
১.২ মোনাডের উদাহরণ
এখানে একটি সিম্পল মোনাডের উদাহরণ দেওয়া হলো, যেখানে Option টাইপকে একটি মোনাড হিসেবে ব্যবহার করা হচ্ছে।
val option1: Option[Int] = Some(5)
val option2: Option[Int] = None
// map example
val result1 = option1.map(x => x * 2) // Output: Some(10)
val result2 = option2.map(x => x * 2) // Output: None
// flatMap example
val result3 = option1.flatMap(x => Some(x * 2)) // Output: Some(10)
val result4 = option2.flatMap(x => Some(x * 2)) // Output: None
println(result1) // Output: Some(10)
println(result2) // Output: None
println(result3) // Output: Some(10)
println(result4) // Output: Noneএখানে:
SomeহলOptionমোনাডের একটি বাস্তবায়ন, যেখানে মান থাকে।NoneহলOptionমোনাডের আরেকটি বাস্তবায়ন, যেখানে মান নেই।
map শুধুমাত্র ভিতরের মানে অপারেশন চালায়, তবে flatMap ভিতরের মান বের করে নতুন মোনাড তৈরি করে।
২. অ্যাপ্লিকেটিভস (Applicatives) in Scala
অ্যাপ্লিকেটিভস মোনাডের মতো কিন্তু কিছুটা আলাদা। অ্যাপ্লিকেটিভ একটি টাইপ ক্লাস (type class) যা ফাংশনকে Applicative টাইপের মধ্যে অ্যাপ্লাই করার ক্ষমতা রাখে। এর মূল ফাংশন দুটি:
map: যেটিMonadথেকে মান নিয়ে আসে এবং একটি ফাংশন প্রয়োগ করে নতুন একটি মোনাড তৈরি করে।ap: এটি একটি অ্যাপ্লিকেটিভের মধ্যে রাখা একটি ফাংশনকে অন্য একটি অ্যাপ্লিকেটিভের উপরে প্রয়োগ করে।
অ্যাপ্লিকেটিভ সাধারণত ফাংশনাল প্রোগ্রামিংয়ে টাইপ-সিস্টেমে কোনো ফাংশন অ্যাপ্লাই করার জন্য ব্যবহৃত হয়, যেখানে আপনি কার্যকরভাবে একটি মান (value) এবং একটি ফাংশন (function) সংযুক্ত করতে পারেন।
২.১ অ্যাপ্লিকেটিভের উদাহরণ
স্কালায় Applicative টাইপ ক্লাসের জন্য Applicative মেথডের উদাহরণ:
// Define an Applicative Functor (here Option is used)
trait Applicative[F[_]] {
def map[A, B](fa: F[A])(f: A => B): F[B]
def ap[A, B](fa: F[A])(ff: F[A => B]): F[B]
}
// Option as an Applicative
object OptionApplicative extends Applicative[Option] {
def map[A, B](fa: Option[A])(f: A => B): Option[B] =
fa match {
case Some(a) => Some(f(a))
case None => None
}
def ap[A, B](fa: Option[A])(ff: Option[A => B]): Option[B] =
(fa, ff) match {
case (Some(a), Some(f)) => Some(f(a))
case _ => None
}
}
// Usage of the Applicative ap
val value1: Option[Int] = Some(5)
val value2: Option[Int => Int] = Some((x: Int) => x * 2)
val result = OptionApplicative.ap(value1)(value2)
println(result) // Output: Some(10)এখানে:
map: যেটি সাধারণভাবে ভ্যালু বা মান পরিবর্তন করতে ব্যবহৃত হয়।ap: এটিতে একটি ফাংশন (যাOption[A => B]টাইপের) আরেকটিOption[A]এর উপর অ্যাপ্লাই করা হয় এবং নতুন একটিOption[B]তৈরি করা হয়।
৩. মোনাডস এবং অ্যাপ্লিকেটিভস-এর পার্থক্য
| বৈশিষ্ট্য | মোনাডস | অ্যাপ্লিকেটিভস |
|---|---|---|
| ফাংশন প্রয়োগ | flatMap দিয়ে ফাংশন অ্যাপ্লাই করা হয়। | ap ব্যবহার করে ফাংশন অ্যাপ্লাই করা হয়। |
| জটিলতা | একটু বেশি জটিল এবং শক্তিশালী। | সহজ এবং কিছুটা কম জটিল। |
| প্রধান কার্যকারিতা | একাধিক স্টেপে মান পরিচালনা করা। | ফাংশন প্রয়োগের জন্য সহজ টুলস প্রদান। |
সারাংশ
- মোনাডস (Monads) হল এমন ডেটা টাইপ যা একাধিক স্টেপে বা অ্যাসিঙ্ক্রোনাস প্রসেসে কাজ করার জন্য উপযোগী, যেখানে একটি মেথডের ভিতরে অন্য মেথডের ফলাফল পাওয়া যায়। এটি
flatMapএবংmapমেথড ব্যবহার করে। - অ্যাপ্লিকেটিভস (Applicatives) হল এমন টাইপ ক্লাস যা একাধিক ফাংশনকে একটি টাইপে অ্যাপ্লাই করতে সক্ষম। এটি
apএবংmapফাংশন ব্যবহার করে।
মোনাড এবং অ্যাপ্লিকেটিভ উভয়েরই ফাংশনাল প্রোগ্রামিংয়ে গুরুত্বপূর্ণ ভূমিকা রয়েছে এবং এগুলি জটিল ডেটা ট্রান্সফরমেশন এবং কার্যকারিতার ক্ষেত্রে ব্যবহৃত হয়।