জেনেরিক্স হলো একটি ভাষার বৈশিষ্ট্য যা 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 লিখবেন, যাতে কিছু ধন জমা রাখা যায়।
একটি TreasureChest কাস্টম টাইপ ডিফাইন করুন, যাতে থাকবে মাত্র একটি ভ্যারিয়েন্ট।
ওই ভ্যারিয়েন্টে একটি অ্যাসোসিয়েটেড String মান থাকবে, যা দিয়ে ধনের সিন্দুকের পাসওয়ার্ড জমা রাখা হবে।
ভ্যারিয়েন্টটিতে একটি অ্যাসোসিয়েটেড জেনেরিক মানও থাকবে, যা দিয়ে ধনটি জমা রাখা হবে। এই মানটি জেনেরিক, তাই ধনটি যেকোনো কিছু হতে পারে।
এই ফাংশনটি দুটি প্যারামিটার নেবে
String (পাসওয়ার্ড দিয়ে চেষ্টা করার জন্য)TreasureChest জেনেরিক কাস্টম টাইপএই ফাংশনটি দেওয়া পাসওয়ার্ডের চেষ্টাটি TreasureChest-এর ভেতরে থাকা String-এর সাথে মিলিয়ে দেখবে।
ফাংশনটি একটি Maybe রিটার্ন করবে।
পাসওয়ার্ড মিলে গেলে TreasureChest থেকে পাওয়া জেনেরিক মানটি (অর্থাৎ ধন!) নিয়ে Just রিটার্ন করুন।
পাসওয়ার্ড না মিললে Nothing রিটার্ন করুন।
এই (হায়ার অর্ডার) ফাংশনটি দুটি প্যারামিটার নেবে
TreasureChest জেনেরিক কাস্টম টাইপ, যার জেনেরিক টাইপও একইএই ফাংশনটি সিন্দুকে থাকা ধনটি দিয়ে মাল্টিপ্লায়ার ফাংশনটি কল করবে।
ফাংশনটি একটি নতুন TreasureChest রিটার্ন করবে, যার পাসওয়ার্ড আগেরটির মতোই থাকবে এবং যাতে গুণ করা ধনটি থাকবে (অর্থাৎ রিটার্ন ভ্যালু)
Exercism-এ সাইন আপ করুন, Elm ট্র্যাকের 28টি কনসেপ্ট110টি অনুশীলনী আর সত্যিকারের মানুষের মেন্টরিং দিয়ে শিখুন ও দক্ষ হয়ে উঠুন, সম্পূর্ণ বিনামূল্যে।