Haskell এ List Comprehensions এবং তাদের ব্যবহার
List Comprehensions Haskell এর একটি শক্তিশালী বৈশিষ্ট্য যা কোডকে আরও সংক্ষিপ্ত এবং পরিষ্কার করে তোলে। এটি লিস্টের উপাদানগুলি থেকে নতুন লিস্ট তৈরি করতে ব্যবহৃত হয়, যেখানে আপনি কেবল একটি একক লাইনেই একাধিক শর্ত এবং রূপান্তর নির্ধারণ করতে পারেন।
List comprehensions Haskell এ সাধারণত do notation অথবা map/filter এর বিকল্প হিসেবে ব্যবহৃত হয়। এটি একটি শক্তিশালী টুল যখন আপনাকে একটি লিস্ট থেকে নির্দিষ্ট উপাদান বের করতে হয় বা তার ওপর কিছু অপারেশন করতে হয়।
1. List Comprehensions এর গঠন (Syntax)
List comprehension এর সাধারণ গঠন হলো:
[expression | element <- list, condition]এখানে:
expression: এটি সেই কাজ বা রূপান্তর যা আপনি করতে চান (যেমন, নতুন উপাদান তৈরি করা)।element <- list: এটি সেই উপাদানকে চিহ্নিত করে যা লিস্টের প্রতিটি উপাদানের সাথে তুলনা করা হবে।condition: এটি একটি শর্ত, যার মাধ্যমে নির্দিষ্ট উপাদানগুলো ফিল্টার করা হবে (অথবা আপনি চাইলে এটি বাদও দিতে পারেন)।
উদাহরণ:
[ x * 2 | x <- [1, 2, 3, 4, 5] ]এখানে, [ x * 2 | x <- [1, 2, 3, 4, 5] ] লিস্টের প্রতিটি উপাদানকে দুই গুণ করবে, যার ফলস্বরূপ:
[2, 4, 6, 8, 10]এটি লিস্টের প্রতিটি উপাদান x নেয় এবং x * 2 রিটার্ন করে।
2. Condition সহ List Comprehension
List comprehension এর মধ্যে শর্ত (condition) ব্যবহার করে লিস্টের নির্দিষ্ট উপাদান নির্বাচন করা যেতে পারে। উদাহরণস্বরূপ:
[ x | x <- [1, 2, 3, 4, 5], x `mod` 2 == 0 ]এখানে, x শুধুমাত্র এমন সংখ্যাগুলোর জন্য নির্বাচিত হবে যা ২ দ্বারা বিভাজ্য। অর্থাৎ, শর্ত x mod 2 == 0 এর মাধ্যমে শুধুমাত্র EVEN সংখ্যাগুলি নির্বাচিত হবে।
ফলস্বরূপ:
[2, 4]3. Multiple Generators এবং Conditions
Haskell এ একটি list comprehension এ একাধিক generators এবং conditions থাকতে পারে। একাধিক জেনারেটর এবং শর্ত ব্যবহার করে আরও জটিল লিস্ট তৈরি করা যেতে পারে।
উদাহরণ ১: একাধিক জেনারেটর
[ (x, y) | x <- [1, 2], y <- [3, 4] ]এখানে, লিস্টের প্রতিটি উপাদান x এবং y এর সন্নিবেশ হবে। অর্থাৎ, এটি [ (1, 3), (1, 4), (2, 3), (2, 4) ] এর সমান হবে।
ফলস্বরূপ:
[(1, 3), (1, 4), (2, 3), (2, 4)]উদাহরণ ২: একাধিক শর্ত
[ x | x <- [1..10], x `mod` 2 == 0, x > 5 ]এখানে, শুধুমাত্র এমন সংখ্যাগুলো নির্বাচন করা হবে যেগুলি ২ দ্বারা বিভাজ্য এবং ৫ এর বেশি।
ফলস্বরূপ:
[6, 8, 10]এখানে প্রথম শর্তে x গুলির মধ্যে এমন সংখ্যাগুলি নির্বাচন করা হয়েছে যা ২ দ্বারা বিভাজ্য, এবং পরবর্তী শর্তে ফিল্টার করা হয়েছে ৫ এর বেশি সংখ্যাগুলি।
4. List Comprehensions with Tuples
Haskell এ Tuples এর সাথে list comprehensions ব্যবহার করা যেতে পারে। এটি এমন একটি কেস যেখানে আপনি একাধিক মানের সমন্বয়ে নতুন লিস্ট তৈরি করতে পারেন।
উদাহরণ:
[ (x, y) | x <- [1, 2, 3], y <- ['a', 'b', 'c'] ]এখানে, x এবং y এর প্রতিটি সংমিশ্রণ একটি টিউপল তৈরি করবে।
ফলস্বরূপ:
[(1,'a'),(1,'b'),(1,'c'),(2,'a'),(2,'b'),(2,'c'),(3,'a'),(3,'b'),(3,'c')]এটি x এবং y এর সকল সংমিশ্রণ নিয়ে একটি নতুন লিস্ট তৈরি করে।
5. List Comprehension with Functions
List comprehension এর সাথে ফাংশনও ব্যবহার করা যেতে পারে। এটি খুবই কার্যকরী যখন আপনি লিস্টের উপর কিছু নির্দিষ্ট ফাংশন প্রয়োগ করতে চান।
উদাহরণ:
[ length x | x <- ["apple", "banana", "cherry"] ]এখানে, আমরা length ফাংশনটি x এর প্রতিটি উপাদানে প্রয়োগ করেছি। ফলস্বরূপ, এটি প্রতিটি শব্দের দৈর্ঘ্য প্রদান করবে।
ফলস্বরূপ:
[5, 6, 6]এখানে "apple", "banana", এবং "cherry" শব্দগুলির দৈর্ঘ্য দেওয়া হয়েছে।
6. Nested List Comprehensions
এটি এমন একটি কৌশল যেখানে একটি list comprehension এর ভিতরে আরেকটি list comprehension থাকে। এটি সাধারণত একাধিক লেভেল বা প্যারামিটার নিয়ে কাজ করার সময় ব্যবহৃত হয়।
উদাহরণ:
[ [x, y] | x <- [1, 2], y <- [3, 4] ]এখানে, আমরা দুটি লিস্ট তৈরি করছি, একটি ১ এবং ২ এর জন্য, এবং অন্যটি ৩ এবং ৪ এর জন্য। প্রতিটি জেনারেটরের সাথে একটি লিস্ট তৈরি হয়।
ফলস্বরূপ:
[[1, 3], [1, 4], [2, 3], [2, 4]]এখানে, আমাদের মূল লিস্টটি দুটি উপাদানের সাথে তৈরি হয় (যেমন, [1, 3], [1, 4], [2, 3], [2, 4])।
উপসংহার
List Comprehensions Haskell এ একটি শক্তিশালী টুল যা কোডকে সংক্ষিপ্ত, পরিষ্কার এবং কার্যকরী করতে সহায়ক। এটি আপনাকে লিস্টের উপাদানগুলির উপর কাজ করার সময় শর্ত ও রূপান্তরের মাধ্যমে নতুন লিস্ট তৈরি করতে সাহায্য করে। একাধিক generators, conditions, tuples, এবং functions ব্যবহার করে আপনি জটিল কাজ সহজে করতে পারেন। Haskell এ List Comprehension এর মাধ্যমে আপনি অনেক ধরনের ডেটা ম্যানিপুলেশন এবং রূপান্তর খুব সহজেই করতে পারবেন।
Read more