স্টিকার শপ

স্টিকার শপ

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

ভূমিকা

ফ্যান্টম টাইপ

ফ্যান্টম টাইপ হলো একটি কাস্টম টাইপের টাইপ প্যারামিটার, যা ওই টাইপের কোনো মান কনস্ট্রাক্টরে ব্যবহার করা হয় না।

এটা একটু বিমূর্ত শোনাচ্ছে, তাই চলুন একটি উদাহরণ দেখি:

pub type Length(unit) {
  Length(amount: Float)
}

এই উদাহরণে unit টাইপ প্যারামিটারটি Length-এর মান কনস্ট্রাক্টরে ব্যবহার করা হয়নি, তাই unit একটি ফ্যান্টম টাইপ।

ব্যবহার না করা এই টাইপ প্যারামিটারটি হয়তো অকাজো মনে হতে পারে, কিন্তু এটি দিয়ে Length মানগুলো কীভাবে ব্যবহার করা যাবে তার উপর আরও কিছু বিধিনিষেধ যোগ করা যায়।

উদাহরণস্বরূপ, আমাদের একটি double ফাংশন থাকতে পারে, যা দৈর্ঘ্যকে গুণ করে। এটি যেকোনো এককের দৈর্ঘ্যের সাথে কাজ করে, তাই টাইপ প্যারামিটারটি একটি জেনেরিক টাইপ ভ্যারিয়েবল।

// This function accepts all Length values
pub fn double(length: Length(unit)) -> Length(unit) {
  Length(length.amount *. 2.0)
}

আমাদের একটি add_inch ফাংশনও থাকতে পারে, যা কেবল তখনই কাজ করে যখন দৈর্ঘ্যটি ইঞ্চিতে থাকে।

// A unit type for inches. It is never constructed so we don't
// define any constructors for it.
pub type Inches

pub fn add_inch(length: Length(Inches)) -> Length(Inches) {
  Length(length.amount +. 1.0)
}

add_inch ফাংশনটি অন্য কোনো একক প্যারামিটারের দৈর্ঘ্য গ্রহণ করবে না; সঠিক এককটিই যেন ব্যবহার হয়, তা নিশ্চিত করতে ফ্যান্টম টাইপটি কাজে লাগানো হয়েছে।

দুটি দৈর্ঘ্যের মান যেন একই এককের হয়, তা নিশ্চিত করেও একটি ফাংশন লেখা যায়, দুটির জন্যই একই টাইপ ভ্যারিয়েবল ব্যবহার করে।

pub fn add(a: Length(unit), b: Length(unit)) -> Length(unit) {
  Length(a.amount +. b.amount)
}
let two_meters: Length(Meters) = Length(2.0)
let two_inches: Length(Inches) = Length(2.0)

add(two_meters, two_meters)
// -> Length(4.0): Length(Meters)

add(two_meters, two_inches)
// Type error! The unit type parameters do not match.

ফ্যান্টম টাইপ ওপেক টাইপের সাথে বেশ ভালোভাবে কাজ করতে পারে। অন্য মডিউলগুলো যদি Length মান তৈরি করতে না পারে, তাহলে আমরা নিশ্চিত করতে পারি যে ভুল একক টাইপ দিয়ে সেগুলো তৈরি হচ্ছে না, এবং শুধু উপরে ডিফাইন করা ফাংশনগুলোই সেগুলোর সাথে ব্যবহার করা যাবে।

নির্দেশনা

লুসির একটি অনলাইন স্টিকার দোকান আছে, যেখানে তিনি সবার প্রিয় প্রোগ্রামিং ভাষাগুলো নিয়ে তৈরি কিউট স্টিকার বিক্রি করেন। পৃথিবীর সব জায়গার মানুষ তার স্টিকার কেনেন, আর সব ভিন্ন ভিন্ন কারেন্সি সামলাতে গিয়ে তার কিছুটা সমস্যায় পড়তে হচ্ছে।

এমন একটি প্রোগ্রাম তৈরি করুন যা দিয়ে লুসি দাম হিসাব করতে পারবেন, আর একই সাথে নিশ্চিত থাকতে পারবেন যে তিনি সবসময় সঠিক কারেন্সিই ব্যবহার করছেন।

1. Usd, Eur এবং Jpy টাইপগুলো ডিফাইন করুন

এই টাইপগুলো লুসির গ্রাহকরা তার স্টিকার কেনার সময় যে ভিন্ন ভিন্ন কারেন্সি ব্যবহার করেন সেগুলো বোঝাতে ব্যবহৃত হয়।

এগুলো ফ্যান্টম টাইপ হিসেবে ব্যবহার করতে হবে এবং এগুলোর কোনো কনস্ট্রাক্টর থাকার প্রয়োজন নেই।

2. Money টাইপ ডিফাইন করুন।

Money টাইপে অর্থের পরিমাণের জন্য একটি Int ফিল্ড, একটি কারেন্সি ফ্যান্টম টাইপ প্যারামিটার থাকা উচিত এবং এটি একটি ওপেক টাইপ হওয়া উচিত।

3. dollar, euro এবং yen ফাংশনগুলো ডিফাইন করুন

dollar, euro এবং yen ফাংশনগুলো ডিফাইন করুন, যেগুলো একটি Int আর্গুমেন্ট নেয় এবং সঠিক কারেন্সিযুক্ত একটি Money মান রিটার্ন করে।

4. total ফাংশন ডিফাইন করুন

total ফাংশন ডিফাইন করুন, যা Money মানের একটি অ্যারে নেয় এবং অ্যারের মোট অর্থের পরিমাণ রিটার্ন করে।

total([euro(120), euro(200), euro(145)])
// -> euro(465)
GitHub-এর মাধ্যমে সম্পাদনা করুন লিংকটি একটি নতুন উইন্ডো বা ট্যাবে খোলে
Gleam Exercism

স্টিকার শপ শুরু করতে প্রস্তুত?

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