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

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

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

ভূমিকা

ডিসক্রিমিনেটেড ইউনিয়ন

ডিসক্রিমিনেটেড ইউনিয়ন টাইপ নির্দিষ্ট সংখ্যক নামযুক্ত কেসের প্রতিনিধিত্ব করে। ডিসক্রিমিনেটেড ইউনিয়নের প্রতিটি মান ঠিক একটি নামযুক্ত কেসের সাথে মিলে যায়।

ডিসক্রিমিনেটেড ইউনিয়ন type কিওয়ার্ড দিয়ে ডিফাইন করা হয়, যেখানে কেসগুলো পাইপ (|) ক্যারেক্টার দিয়ে আলাদা করা থাকে:

type Season =
    | Spring
    | Summer
    | Autumn
    | Winter

ডিসক্রিমিনেটেড ইউনিয়নের প্রতিটি কেসের সাথে ঐচ্ছিকভাবে ডেটা যুক্ত থাকতে পারে, আর ভিন্ন ভিন্ন কেসে ভিন্ন ভিন্ন ধরনের ডেটা থাকতে পারে। কোনো কেসের সাথেই যদি ডেটা যুক্ত না থাকে, তাহলে ডিসক্রিমিনেটেড ইউনিয়নটি অনেকটা সেরকম হয়, যাকে অন্য ভাষাগুলো সাধারণত এনুমারেশন (বা এনাম) নামে ডাকে।

type Number =
    | Integer of int
    | Float of float
    | Invalid

নির্দিষ্ট কোনো কেসের জন্য মান তৈরি করা যায় তার নাম উল্লেখ করে (যেমন, Success)। যেহেতু কেসের নামগুলো শুধুই কনস্ট্রাক্টর ফাংশন, তাই সংশ্লিষ্ট ডেটা সাধারণ ফাংশন আর্গুমেন্ট হিসেবে পাঠানো যায়। যদি অন্য কোনো ডিসক্রিমিনেটেড ইউনিয়নে একই নামের একটি কেস ডিফাইন করা থাকে, তাহলে আপনাকে তার পুরো নাম ব্যবহার করতে হবে (যেমন Result.Success)।

let byName = Integer 2
let byFullName = Number.Invalid

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

ডিসক্রিমিনেটেড ইউনিয়নের সাথে কাজ করতে if/elif/else এক্সপ্রেশন ব্যবহার করা গেলেও, এদের সাথে কাজ করার প্রস্তাবিত উপায় হলো আইডেন্টিফায়ার প্যাটার্ন ব্যবহার করে প্যাটার্ন ম্যাচিং:

let describe number =
    match number with
    | Integer i -> sprintf "Integer: %d" i
    | Float d  -> sprintf "Float: %f" d
    | Invalid   -> "Invalid"

নির্দেশনা

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

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

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

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

1. অনুমোদন ডিফাইন করুন

আপনার পার্টনার যে আইডিয়াই প্রস্তাব করুন না কেন, আপনি তিনটি অপশনের একটি দিয়ে উত্তর দেবেন: হ্যাঁ, না বা হয়তো।

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

2. রান্নার ধরনগুলো ডিফাইন করুন

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

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

3. সিনেমার ঘরানাগুলো ডিফাইন করুন

বেছে নেওয়ার জন্য অনেক সিনেমা আছে, তাই বিষয়টা একটু সীমিত করতে আপনার পার্টনার সিনেমার ঘরানাও উল্লেখ করেছেন।

নিচের ঘরানাগুলোকে কেস হিসেবে প্রকাশ করতে Genre ডিসক্রিমিনেটেড ইউনিয়নটি ডিফাইন করুন: Crime, Horror, Romance এবং Thriller।

4. অ্যাক্টিভিটি ডিফাইন করুন

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

এই অ্যাক্টিভিটির ধরনগুলোকে প্রকাশ করতে Activity ডিসক্রিমিনেটেড ইউনিয়নটি ডিফাইন করুন:

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

5. অ্যাক্টিভিটি রেট করুন

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

  • বোর্ড গেম খেলা: না।
  • আরাম করা: না।
  • সিনেমা দেখা: সিনেমাটি রোমান্টিক হলে হ্যাঁ; নাহলে না।
  • রেস্টুরেন্টে যাওয়া: রান্নার ধরন কোরিয়ান হলে হ্যাঁ, তুর্কি হলে হয়তো।
  • হাঁটতে যাওয়া: হাঁটাটি তিন কিলোমিটারের কম হলে হ্যাঁ; পাঁচ কিলোমিটারের কম হলে হয়তো; নাহলে না।

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

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

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

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