ট্র্যাক
/
Haskell
Haskell
/
অনুশীলনী
/
ভ্যালেন্টাইনস ডে
ভ্যালেন্টাইনস ডে

ভ্যালেন্টাইনস ডে

লার্নিং অনুশীলনী

ভূমিকা

একটি অ্যালজেব্রিক ডেটা টাইপ (ADT) নির্দিষ্ট সংখ্যক নামযুক্ত কেস বোঝায়। ADT-এর প্রতিটি মান ঠিক একটি নামযুক্ত কেসের সাথে মিলে যায়।

ADT ডিফাইন করা হয় data কিওয়ার্ড দিয়ে, আর কেসগুলোকে পাইপ (|) ক্যারেক্টার দিয়ে আলাদা করা হয়। কোনো কেসের সাথে যদি কোনো ডেটা যুক্ত না থাকে, তাহলে ADT-টি অনেকটা সেরকমই, যাকে অন্য ভাষাগুলো সাধারণত এনুমারেশন (বা এনাম) বলে।

data Season
  = Spring
  | Summer
  | Autumn
  | Winter

ADT-এর প্রতিটি কেসের সাথে ইচ্ছা হলে ডেটা যুক্ত থাকতে পারে, আর আলাদা আলাদা কেসে আলাদা টাইপের ডেটা থাকতে পারে। কেসের সাথে ডেটা যুক্ত থাকলে একটি কনস্ট্রাক্টর লাগে।

data Number
  = NInt Int      --'NInt' is the constructor for an Int Number.
  | NFloat Float  --'NFloat' is the constructor for an Float Number.
  | Invalid       --'Invalid' does not have data associated to it.

নির্দিষ্ট কোনো কেসের জন্য মান তৈরি করা যায় তার নাম উল্লেখ করে (যেমন, NInt 22)। কেসের নাম আসলে কনস্ট্রাক্টর ফাংশন, তাই যুক্ত ডেটা সাধারণ ফাংশন আর্গুমেন্টের মতোই পাস করা যায়।

ADT-এর স্ট্রাকচারাল ইকুয়ালিটি থাকে, অর্থাৎ একই কেসের এবং একই (ঐচ্ছিক) ডেটাযুক্ত দুটি মান সমতুল্য।

ADT নিয়ে কাজ করতে if/else এক্সপ্রেশন ব্যবহার করা গেলেও, এর জন্য সুপারিশ করা হয় প্যাটার্ন ম্যাচিং, অর্থাৎ কেস স্টেটমেন্ট ব্যবহার করা:

add1 :: Number -> String
add1 number =
    case number of
      NInt    i -> show (i + 1)
      NFloat  f -> show (f + 1.0)
      Invalid   -> error "Invalid input"

নির্দেশনা

এই অনুশীলনীতে ভ্যালেন্টাইনস ডে, আর আপনি ভাবছেন আপনার সঙ্গীর সাথে কী করবেন। আপনার সঙ্গীর মাথায় অনেক রকম আইডিয়া আছে, আর সবচেয়ে ভালো অ্যাক্টিভিটি খুঁজে বের করার জন্য তিনি আপনাকে সেই আইডিয়াগুলো রেট করতে বলছেন।

আপনার সঙ্গী নিচের আইডিয়াগুলো প্রস্তাব করেছেন:

  • বোর্ড গেম খেলা
  • চিল আউট
  • মুভি দেখা
  • রেস্টুরেন্টে যাওয়া
  • হাঁটতে যাওয়া

ভ্যালেন্টাইনস ডে-র অ্যাক্টিভিটি বেছে নিতে সাহায্য করার জন্য আপনার সামনে ছয়টি কাজ আছে।

1. Approval ডিফাইন করুন

আপনার সঙ্গী যে আইডিয়াই প্রস্তাব করুন না কেন, আপনি তিনটি অপশনের একটি দিয়ে উত্তর দেন: yes, no বা maybe।

নিচের তিনটি কেসের জন্য এই অপশনগুলো প্রকাশ করতে Approval অ্যালজেব্রিক ডেটা টাইপ ডিফাইন করুন: Yes, No বা Maybe।

2. Cuisine ডিফাইন করুন

আপনার সঙ্গী দুটি সম্ভাব্য রেস্টুরেন্ট বেছে নিয়েছেন: একটি কোরিয়ান খাবারের, আর অন্যটি তুর্কি খাবারের।

নিচের দুইটি কেস হিসেবে এই রেস্টুরেন্টগুলোকে প্রকাশ করতে Cuisine অ্যালজেব্রিক ডেটা টাইপ ডিফাইন করুন: Korean বা Turkish।

3. Genre ডিফাইন করুন

বেছে নেওয়ার জন্য অনেক মুভি আছে, তাই বিষয়টা একটু গুছিয়ে আনার জন্য আপনার সঙ্গী তাঁর পছন্দের জনরাটিও জানিয়েছেন।

নিচের জনরাগুলো প্রকাশ করতে Genre অ্যালজেব্রিক ডেটা টাইপ ডিফাইন করুন: Crime, Horror, Romance বা Thriller।

4. Activity ডিফাইন করুন

যেমন বলা হয়েছে, আপনার সঙ্গী পাঁচটি সম্ভাব্য অ্যাক্টিভিটি নিয়ে ভেবেছেন: বোর্ড গেম খেলা, চিল আউট, মুভি দেখা, রেস্টুরেন্টে যাওয়া আর হাঁটতে যাওয়া।

এই অ্যাক্টিভিটিগুলো প্রকাশ করতে Activity অ্যালজেব্রিক ডেটা টাইপ ডিফাইন করুন:

  • BoardGame: কোনো সংশ্লিষ্ট ডেটা নেই।
  • Chill: কোনো সংশ্লিষ্ট ডেটা নেই।
  • Movie: সংশ্লিষ্ট ডেটা হিসেবে এর Genre আছে।
  • Restaurant: সংশ্লিষ্ট ডেটা হিসেবে এর Cuisine আছে।
  • Walk: সংশ্লিষ্ট ডেটা হিসেবে কত কিলোমিটার হাঁটতে হবে তা বোঝানো একটি Int আছে।

5. Activity রেট করুন

অবশেষে, আপনি আপনার সঙ্গীর আইডিয়াগুলো রেট করার জন্য তৈরি। আপনার সঙ্গীর আইডিয়া নিয়ে আপনার অনুভূতি এই রকম:

  • বোর্ড গেম খেলা: no.
  • চিল আউট: no.
  • মুভি দেখা: রোমান্টিক মুভি হলে yes, অন্যথায় no.
  • রেস্টুরেন্টে যাওয়া: খাবার কোরিয়ান হলে yes, তুর্কি হলে maybe.
  • হাঁটতে যাওয়া: হাঁটার দূরত্ব তিন কিলোমিটারের কম হলে yes; তিন থেকে পাঁচ কিলোমিটার (সহ) হলে maybe; অন্যথায় no.

উপরের অনুভূতিগুলোর ভিত্তিতে একটি Activity মান নিয়ে Approval রিটার্ন করে এমন rateActivity নামের একটি ফাংশন ইমপ্লিমেন্ট করুন। উদাহরণস্বরূপ:

rateActivity (Restaurant Turkish)
-- -> Maybe
GitHub-এর মাধ্যমে সম্পাদনা করুন লিংকটি একটি নতুন উইন্ডো বা ট্যাবে খোলে
Haskell Exercism

ভ্যালেন্টাইনস ডে শুরু করতে প্রস্তুত?

Exercism-এ সাইন আপ করুন, Haskell ট্র্যাকের 107টি অনুশীলনী আর সত্যিকারের মানুষের মেন্টরিং দিয়ে শিখুন ও দক্ষ হয়ে উঠুন, সম্পূর্ণ বিনামূল্যে।