ট্র্যাক
/
Elm
Elm
/
অনুশীলনী
/
গুপ্তধনের সিন্দুক
গুপ্তধনের সিন্দুক

গুপ্তধনের সিন্দুক

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

ভূমিকা

জেনেরিক্স

ভূমিকা

জেনেরিক্স হলো একটি ভাষার বৈশিষ্ট্য যা Code রিইউজ সক্ষম করে। উদাহরণস্বরূপ, একটি অ্যারে কী টাইপ ধারণ করে তা তার দৈর্ঘ্য গণনা করার জন্য গুরুত্বপূর্ণ হওয়া উচিত নয়। একারণেই length ফাংশনটি তার টাইপ সিগনেচারে একটি জেনেরিক টাইপ প্যারামিটার a ব্যবহার করে।

length : List a -> Int

টাইপে প্যারামিটার

যখন একটি টাইপ অন্য একটি টাইপের উপর জেনেরিক হয়, তখন আমরা সেই অন্য টাইপের জন্য একটি ছোট হাতের অক্ষরের নাম ব্যবহার করি এবং এটিকে টাইপ প্যারামিটার বলি। সাধারণ উদাহরণ হলো List, Maybe এবং Result কাস্টম টাইপ।

-- Maybe is generic over the type a
type Maybe a
    = Nothing
    | Just a

someString : Maybe String
someString = Just "hello"

someInt : Maybe Int
someInt = Just 42

টাইপ প্যারামিটারের নাম সম্পর্কে একটি গুরুত্বপূর্ণ মন্তব্য হলো, এগুলো একাধিক অক্ষরের হতে পারে। একমাত্র শর্ত হলো এগুলো অবশ্যই ছোট হাতের অক্ষরের নাম হতে হবে। তাই, যখন উপযোগী হয়, আমরা তাদের বর্ণনামূলক নাম দিয়ে থাকি।

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

-- Result is generic over the types error and value
type Result error value
    = Ok value
    | Err error

রেকর্ড টাইপ অ্যালিয়াসেও টাইপ প্যারামিটার থাকতে পারে, যদিও এটি কম দেখা যায়।

-- Event is generic over the type a
type alias Event a =
    { at : Time
    , data : a 
    }

ফাংশনে টাইপ প্যারামিটার

যেহেতু টাইপ জেনেরিক হতে পারে, ফাংশনও হতে পারে। জেনেরিক টাইপ নিয়ে কাজ করে এমন ফাংশন লেখা যায়, যেমন Maybe.withDefault.

withDefault : a -> Maybe a -> a
withDefault default maybe =
    case maybe of
      Just value -> value
      Nothing -> default

যে ফাংশনগুলো অন্য ফাংশনকে প্যারামিটার হিসেবে নেয় তাদের হায়ার অর্ডার ফাংশন বলা হয়, এবং এগুলোও জেনেরিক হতে পারে।

map : (a -> b) -> Maybe a -> Maybe b
map function maybe =
  case maybe of
    Just value ->
      Just (function value)

    Nothing ->
      Nothing

নির্দেশনা

এই অনুশীলনীতে আপনি একটি জেনেরিক (আসলে জাদুকরী!) TreasureChest লিখবেন, যাতে কিছু ধন জমা রাখা যায়।

1. TreasureChest জেনেরিক কাস্টম টাইপটি ডিফাইন করুন

একটি TreasureChest কাস্টম টাইপ ডিফাইন করুন, যাতে থাকবে মাত্র একটি ভ্যারিয়েন্ট।

ওই ভ্যারিয়েন্টে একটি অ্যাসোসিয়েটেড String মান থাকবে, যা দিয়ে ধনের সিন্দুকের পাসওয়ার্ড জমা রাখা হবে।

ভ্যারিয়েন্টটিতে একটি অ্যাসোসিয়েটেড জেনেরিক মানও থাকবে, যা দিয়ে ধনটি জমা রাখা হবে। এই মানটি জেনেরিক, তাই ধনটি যেকোনো কিছু হতে পারে।

2. getTreasure ফাংশনটি ডিফাইন করুন

এই ফাংশনটি দুটি প্যারামিটার নেবে

  • একটি String (পাসওয়ার্ড দিয়ে চেষ্টা করার জন্য)
  • একটি TreasureChest জেনেরিক কাস্টম টাইপ

এই ফাংশনটি দেওয়া পাসওয়ার্ডের চেষ্টাটি TreasureChest-এর ভেতরে থাকা String-এর সাথে মিলিয়ে দেখবে।

ফাংশনটি একটি Maybe রিটার্ন করবে।

পাসওয়ার্ড মিলে গেলে TreasureChest থেকে পাওয়া জেনেরিক মানটি (অর্থাৎ ধন!) নিয়ে Just রিটার্ন করুন।

পাসওয়ার্ড না মিললে Nothing রিটার্ন করুন।

3. multiplyTreasure ফাংশনটি ডিফাইন করুন

এই (হায়ার অর্ডার) ফাংশনটি দুটি প্যারামিটার নেবে

  • একটি মাল্টিপ্লায়ার ফাংশন, যা একটি জেনেরিক প্যারামিটার নেয় এবং একই জেনেরিক টাইপের একটি অ্যারে রিটার্ন করে
  • একটি TreasureChest জেনেরিক কাস্টম টাইপ, যার জেনেরিক টাইপও একই

এই ফাংশনটি সিন্দুকে থাকা ধনটি দিয়ে মাল্টিপ্লায়ার ফাংশনটি কল করবে।

ফাংশনটি একটি নতুন TreasureChest রিটার্ন করবে, যার পাসওয়ার্ড আগেরটির মতোই থাকবে এবং যাতে গুণ করা ধনটি থাকবে (অর্থাৎ রিটার্ন ভ্যালু)

GitHub-এর মাধ্যমে সম্পাদনা করুন লিংকটি একটি নতুন উইন্ডো বা ট্যাবে খোলে
Elm Exercism

গুপ্তধনের সিন্দুক শুরু করতে প্রস্তুত?

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