একটি অ্যালজেব্রিক ডেটা টাইপ (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"
এই অনুশীলনীতে ভ্যালেন্টাইনস ডে, আর আপনি ভাবছেন আপনার সঙ্গীর সাথে কী করবেন। আপনার সঙ্গীর মাথায় অনেক রকম আইডিয়া আছে, আর সবচেয়ে ভালো অ্যাক্টিভিটি খুঁজে বের করার জন্য তিনি আপনাকে সেই আইডিয়াগুলো রেট করতে বলছেন।
আপনার সঙ্গী নিচের আইডিয়াগুলো প্রস্তাব করেছেন:
ভ্যালেন্টাইনস ডে-র অ্যাক্টিভিটি বেছে নিতে সাহায্য করার জন্য আপনার সামনে ছয়টি কাজ আছে।
আপনার সঙ্গী যে আইডিয়াই প্রস্তাব করুন না কেন, আপনি তিনটি অপশনের একটি দিয়ে উত্তর দেন: yes, no বা maybe।
নিচের তিনটি কেসের জন্য এই অপশনগুলো প্রকাশ করতে Approval অ্যালজেব্রিক ডেটা টাইপ ডিফাইন করুন: Yes, No বা Maybe।
আপনার সঙ্গী দুটি সম্ভাব্য রেস্টুরেন্ট বেছে নিয়েছেন: একটি কোরিয়ান খাবারের, আর অন্যটি তুর্কি খাবারের।
নিচের দুইটি কেস হিসেবে এই রেস্টুরেন্টগুলোকে প্রকাশ করতে Cuisine অ্যালজেব্রিক ডেটা টাইপ ডিফাইন করুন: Korean বা Turkish।
বেছে নেওয়ার জন্য অনেক মুভি আছে, তাই বিষয়টা একটু গুছিয়ে আনার জন্য আপনার সঙ্গী তাঁর পছন্দের জনরাটিও জানিয়েছেন।
নিচের জনরাগুলো প্রকাশ করতে Genre অ্যালজেব্রিক ডেটা টাইপ ডিফাইন করুন: Crime, Horror, Romance বা Thriller।
যেমন বলা হয়েছে, আপনার সঙ্গী পাঁচটি সম্ভাব্য অ্যাক্টিভিটি নিয়ে ভেবেছেন: বোর্ড গেম খেলা, চিল আউট, মুভি দেখা, রেস্টুরেন্টে যাওয়া আর হাঁটতে যাওয়া।
এই অ্যাক্টিভিটিগুলো প্রকাশ করতে Activity অ্যালজেব্রিক ডেটা টাইপ ডিফাইন করুন:
BoardGame: কোনো সংশ্লিষ্ট ডেটা নেই।Chill: কোনো সংশ্লিষ্ট ডেটা নেই।Movie: সংশ্লিষ্ট ডেটা হিসেবে এর Genre আছে।Restaurant: সংশ্লিষ্ট ডেটা হিসেবে এর Cuisine আছে।Walk: সংশ্লিষ্ট ডেটা হিসেবে কত কিলোমিটার হাঁটতে হবে তা বোঝানো একটি Int আছে।অবশেষে, আপনি আপনার সঙ্গীর আইডিয়াগুলো রেট করার জন্য তৈরি। আপনার সঙ্গীর আইডিয়া নিয়ে আপনার অনুভূতি এই রকম:
উপরের অনুভূতিগুলোর ভিত্তিতে একটি Activity মান নিয়ে Approval রিটার্ন করে এমন rateActivity নামের একটি ফাংশন ইমপ্লিমেন্ট করুন। উদাহরণস্বরূপ:
rateActivity (Restaurant Turkish)
-- -> Maybe
Exercism-এ সাইন আপ করুন, Haskell ট্র্যাকের 107টি অনুশীলনী আর সত্যিকারের মানুষের মেন্টরিং দিয়ে শিখুন ও দক্ষ হয়ে উঠুন, সম্পূর্ণ বিনামূল্যে।