Haskell এ Pattern Matching এর মাধ্যমে Decision Making
Pattern Matching Haskell এর একটি অত্যন্ত শক্তিশালী বৈশিষ্ট্য, যা সিদ্ধান্ত গ্রহণ (Decision Making) এবং ডেটা স্ট্রাকচারগুলির সাথে কাজ করার সময় কোডকে আরও পরিষ্কার, সংক্ষিপ্ত এবং কার্যকরী করে তোলে। Pattern Matching ব্যবহার করে আপনি ডেটার আকার, ধরণ বা মানের উপর ভিত্তি করে সিদ্ধান্ত নিতে পারেন।
Haskell এ, pattern matching ব্যবহার করে একাধিক কেস বা শর্তের জন্য সহজে সিদ্ধান্ত নেওয়া যায়। এটি মূলত লিস্ট, টিউপলস, ডেটা টাইপ বা অন্যান্য ডেটা স্ট্রাকচার এর মান বা আকারের সাথে তুলনা করে কাজ করে।
১. Pattern Matching ব্যবহার করে Decision Making
Pattern Matching এর মাধ্যমে কোডের বিভিন্ন শর্তে সিদ্ধান্ত নেওয়া খুবই সহজ এবং পরিষ্কার। উদাহরণস্বরূপ, আপনি if-else বা case স্টেটমেন্টের পরিবর্তে pattern matching ব্যবহার করতে পারেন।
উদাহরণ ১: লিস্টের প্রথম উপাদান চেক করা
isEmpty :: [a] -> Bool
isEmpty [] = True -- যদি লিস্টটি খালি হয়
isEmpty (_:_) = False -- যদি লিস্টটি খালি না হয়এখানে isEmpty ফাংশনটি একটি লিস্ট নেয় এবং তা খালি কিনা চেক করে। pattern matching এর মাধ্যমে এটি দুটি ভিন্ন কেস চেক করছে:
- যদি লিস্টটি খালি হয়, তবে
Trueফেরত দেয়। - যদি লিস্টটি খালি না হয়, তবে
Falseফেরত দেয়।
ব্যবহার:
Prelude> isEmpty []
True
Prelude> isEmpty [1, 2, 3]
Falseএখানে [] (খালি লিস্ট) এবং (_:_) (যেখানে _ প্রথম উপাদান এবং xs বাকি উপাদানগুলির প্রতিনিধিত্ব করে) ব্যবহার করা হয়েছে।
২. Pattern Matching ব্যবহার করে বিভিন্ন কেস চেক করা
Haskell এ আপনি case স্টেটমেন্টের মাধ্যমে বিভিন্ন শর্ত চেক করতে পারেন, কিন্তু pattern matching এর মাধ্যমে অনেক সহজে সিদ্ধান্ত নেওয়া যায়। উদাহরণ:
উদাহরণ ২: সংখ্যার ধরণের ওপর ভিত্তি করে সিদ্ধান্ত নেওয়া
describeNumber :: Int -> String
describeNumber 0 = "Zero"
describeNumber 1 = "One"
describeNumber 2 = "Two"
describeNumber _ = "Other" -- _ ব্যবহার করে অন্য সব মানকে ধরছেএখানে, describeNumber ফাংশনটি একটি সংখ্যা নিয়ে সেটি 0, 1, 2 বা অন্য যেকোনো মান হতে পারে, সেক্ষেত্রে ভিন্ন ভিন্ন ফলাফল দিবে।
ব্যবহার:
Prelude> describeNumber 0
"Zero"
Prelude> describeNumber 1
"One"
Prelude> describeNumber 5
"Other"এখানে, _ দিয়ে "Other" কেসটি প্রতিস্থাপন করা হয়েছে, যা অন্যান্য সব সংখ্যার জন্য প্রযোজ্য।
৩. Pattern Matching এবং টিউপলস
Pattern Matching শুধু লিস্টের জন্যই নয়, আপনি টিউপল বা ডেটা টাইপ এর ক্ষেত্রেও এটি ব্যবহার করতে পারেন।
উদাহরণ ৩: টিউপল এর মানের ওপর ভিত্তি করে সিদ্ধান্ত নেওয়া
describeTuple :: (Int, Int) -> String
describeTuple (0, 0) = "Origin"
describeTuple (x, 0) = "X-axis"
describeTuple (0, y) = "Y-axis"
describeTuple (x, y) = "Point (" ++ show x ++ ", " ++ show y ++ ")"এখানে, describeTuple ফাংশনটি একটি টিউপল নেয়, এবং টিউপলটির মানের ওপর ভিত্তি করে বিভিন্ন সিদ্ধান্ত নেয়:
(0, 0)এর জন্য "Origin"।(x, 0)এর জন্য "X-axis"।(0, y)এর জন্য "Y-axis"।- অন্য যেকোনো টিউপল এর জন্য "Point (x, y)"।
ব্যবহার:
Prelude> describeTuple (0, 0)
"Origin"
Prelude> describeTuple (3, 0)
"X-axis"
Prelude> describeTuple (0, 4)
"Y-axis"
Prelude> describeTuple (3, 4)
"Point (3, 4)"এখানে টিউপল (x, y) এর মান অনুযায়ী বিভিন্ন আউটপুট আসছে।
৪. Pattern Matching এর সাথে Guards
Haskell এ Guards ব্যবহৃত হয় যখন আপনি pattern matching এর সাথে অতিরিক্ত শর্ত যোগ করতে চান। এটি কন্ডিশনাল (শর্তসাপেক্ষ) রুল হিসেবে কাজ করে, যা আপনার কোডকে আরও ফ্লেক্সিবল করে তোলে।
উদাহরণ ৪: Guards সহ Pattern Matching
describeAge :: Int -> String
describeAge age
| age < 13 = "Child"
| age < 20 = "Teenager"
| age < 65 = "Adult"
| otherwise = "Senior"এখানে, describeAge ফাংশনটি একটি বয়স নেয় এবং তার ভিত্তিতে এটি "Child", "Teenager", "Adult", বা "Senior" বলে আউটপুট প্রদান করে। Guards ব্যবহার করা হয়েছে যাতে বিভিন্ন শর্তে কাজ করা যায়।
ব্যবহার:
Prelude> describeAge 10
"Child"
Prelude> describeAge 16
"Teenager"
Prelude> describeAge 30
"Adult"
Prelude> describeAge 70
"Senior"এখানে | দিয়ে শর্তগুলি চেক করা হয়েছে এবং otherwise দিয়ে শেষ শর্তটি ধরা হয়েছে।
উপসংহার
Haskell এ Pattern Matching খুবই শক্তিশালী এবং পরিষ্কারভাবে কোড লেখার জন্য একটি অপরিহার্য টুল। এটি বিশেষভাবে Decision Making এর জন্য ব্যবহৃত হয়, যেখানে আপনি ডেটার আকার বা মানের ওপর ভিত্তি করে বিভিন্ন শর্তে সিদ্ধান্ত নিতে পারেন। Pattern Matching এর মাধ্যমে কোডটি আরও সোজা, সংক্ষিপ্ত এবং দক্ষ হয়ে ওঠে। এটি Guards বা case স্টেটমেন্টের সাথে একত্রিত হলে আরও শক্তিশালী হয়, এবং কোডের জটিলতা কমায়।
Read more