Pattern Matching এর মাধ্যমে Decision Making
Pattern Matching হল Erlang-এর একটি শক্তিশালী বৈশিষ্ট্য যা আপনাকে ভ্যালু, ডেটা টাইপ এবং স্ট্রাকচার অনুসারে সিদ্ধান্ত নিতে সাহায্য করে। এটি কার্যকরভাবে ডেটা বা ইনপুটের ওপর ভিত্তি করে বিভিন্ন কাজ সম্পাদন করতে ব্যবহৃত হয়। Erlang-এ pattern matching ব্যবহার করা হয় সিদ্ধান্ত নেওয়ার জন্য, যেমন কোন ভ্যালু বা ডেটা টাইপ পাওয়ার ভিত্তিতে ফাংশনের আচরণ পরিবর্তন করা।
Erlang-এ pattern matching ফাংশন ডিফাইনেশনের অংশ হিসেবে কাজ করে এবং ফাংশনের আর্গুমেন্টগুলোর সাথে মিলিয়ে নির্ধারণ করা হয় যে কোন কোড এক্সিকিউট হবে।
Pattern Matching এর মূল ধারণা
Pattern matching এর মাধ্যমে একটি ডেটা স্ট্রাকচারের প্রতিটি উপাদান বা অংশের সাথে মেলানো হয় এবং যদি মেলানো যায়, তবে সেই কোড ব্লক এক্সিকিউট হয়। এটা guard clauses বা conditional statements এর তুলনায় আরও বেশি কার্যকরী এবং সুসংগঠিত, কারণ এটি বিভিন্ন ধরনের পরিস্থিতি এবং ইনপুটের ভিত্তিতে কোডের বিভিন্ন অংশ কার্যকর করে।
Pattern Matching এর উদাহরণ
ধরা যাক, আমাদের একটি ফাংশন রয়েছে যা দুইটি ইনপুটের ওপর ভিত্তি করে কাজ করবে। আমাদের উদ্দেশ্য হল ইনপুট দুটি মিলিয়ে দেখতে এবং নির্দিষ্ট কিছু কাজ সম্পাদন করা।
উদাহরণ ১: একটি সাধারণ Pattern Matching
check_value(0) -> "Zero";
check_value(1) -> "One";
check_value(_) -> "Other".এখানে, check_value/1 ফাংশনে তিনটি ভিন্ন প্যাটার্ন রয়েছে:
- প্রথম প্যাটার্নটি যদি ইনপুট
0হয় তবে"Zero"রিটার্ন করবে। - দ্বিতীয় প্যাটার্নটি যদি ইনপুট
1হয় তবে"One"রিটার্ন করবে। - তৃতীয় প্যাটার্নটি অন্য যেকোনো ভ্যালুর জন্য
"Other"রিটার্ন করবে, কারণ এখানে_ব্যবহৃত হয়েছে, যা একটি wildcard প্যাটার্ন (যা সব ধরনের ইনপুটের সাথে ম্যাচ করে)।
ব্যবহার:
1> check_value(0).
"Zero"
2> check_value(1).
"One"
3> check_value(42).
"Other"এখানে, Erlang নিজে থেকেই ইনপুট অনুযায়ী প্যাটার্ন মেলানোর মাধ্যমে সিদ্ধান্ত নিয়েছে কোন কোড এক্সিকিউট হবে।
Pattern Matching with Tuples
Tuple-এর মাধ্যমে মেলানোও একটি সাধারণ কৌশল। ধরুন, আমরা একটি ফাংশন তৈরি করেছি যা দুটি সংখ্যা নিয়ে গাণিতিক হিসাব করবে। যদি সংখ্যা দুটি একটি tuple হিসেবে আসে, তবে ফাংশনটি সেই টিউপলের প্রথম দুটি মানের ওপর নির্ভর করে সিদ্ধান্ত নেবে।
উদাহরণ ২: Tuple ব্যবহার করে Pattern Matching
sum({a, X, Y}) -> X + Y;
sum({b, X, Y}) -> X * Y;
sum({_, X, Y}) -> X - Y.এখানে, আমরা একটি tuple {a, X, Y} বা {b, X, Y} আর্গুমেন্ট হিসেবে নিচ্ছি এবং সেই অনুযায়ী একটি গাণিতিক কাজ (যোগ, গুণ, অথবা বিয়োগ) করছি।
ব্যবহার:
1> sum({a, 5, 3}).
8
2> sum({b, 5, 3}).
15
3> sum({c, 5, 3}).
2এখানে, {a, 5, 3} প্যাটার্নের সাথে মিলে গেলে যোগফল হবে 8, {b, 5, 3} প্যাটার্নের সাথে মিলে গেলে গুণফল হবে 15, এবং অন্য কোনো প্যাটার্নের সাথে মিলে গেলে বিয়োগফল হবে 2।
Pattern Matching with Lists
Erlang-এ List এর উপাদানগুলোর সাথে মেলানো খুবই সাধারণ এবং গুরুত্বপূর্ণ। ফাংশন ডিফাইন করার সময় আপনি লিস্টের প্রথম উপাদান বা লিস্টের আকারের ভিত্তিতে সিদ্ধান্ত নিতে পারেন।
উদাহরণ ৩: List ব্যবহার করে Pattern Matching
process_list([H | T]) -> "Head: " ++ integer_to_list(H) ++ ", Tail: " ++ lists:concat(map(fun integer_to_list/1, T));
process_list([]) -> "Empty list".এখানে, প্রথম প্যাটার্ন [H | T] একটি লিস্টের প্রথম উপাদান H (হেড) এবং বাকি উপাদানগুলিকে T (টেইল) হিসেবে আলাদা করে নেয়। দ্বিতীয় প্যাটার্নটি খালি লিস্টের জন্য একটি আলাদা সিদ্ধান্ত নেয়।
ব্যবহার:
1> process_list([1, 2, 3, 4]).
"Head: 1, Tail: 234"
2> process_list([]).
"Empty list"এখানে, [1, 2, 3, 4] লিস্টে 1 হল হেড এবং [2, 3, 4] হল টেইল। অন্যদিকে খালি লিস্টের জন্য "Empty list" রিটার্ন হয়।
Pattern Matching with Guards
Guards ব্যবহারের মাধ্যমে আপনি pattern matching এর সাথে কিছু শর্তও যোগ করতে পারেন। Guards হল অতিরিক্ত শর্ত যা when ক্লজের মাধ্যমে ব্যবহার করা হয়, যা প্যাটার্ন ম্যাচের পর ফাংশনটি যখন কিছু অতিরিক্ত শর্ত পূরণ করে তখন কার্যকর হয়।
উদাহরণ ৪: Pattern Matching with Guards
check_number(N) when N >= 0 -> "Positive or Zero";
check_number(N) when N < 0 -> "Negative".এখানে, যদি সংখ্যা ০ বা তার চেয়ে বড় হয় তবে "Positive or Zero" রিটার্ন হবে, এবং যদি সংখ্যা ঋণাত্মক হয় তবে "Negative" রিটার্ন হবে।
ব্যবহার:
1> check_number(5).
"Positive or Zero"
2> check_number(-3).
"Negative"এখানে, গার্ড ব্যবহারের মাধ্যমে একটি শর্ত যুক্ত করা হয়েছে যেটি প্যাটার্ন ম্যাচের পরে সিদ্ধান্ত নিয়েছে যে ইনপুটটি ০ বা তার চেয়ে বড় কি না।
উপসংহার
Pattern Matching Erlang এর একটি শক্তিশালী বৈশিষ্ট্য, যা decision making এর জন্য খুবই উপকারী। এটি কোডকে অনেক বেশি পরিষ্কার এবং দক্ষ করে তোলে কারণ এটি ডেটার সাথে মিলিয়ে সিদ্ধান্ত নেয়। Pattern matching এর মাধ্যমে আপনি বিভিন্ন ডেটা টাইপের জন্য নির্দিষ্ট কোড এক্সিকিউট করতে পারেন, যেমন atom, tuple, list, এবং guards ব্যবহার করে আরও সূক্ষ্ম শর্ত তৈরি করতে পারেন।
Read more