एक एल्जेब्रिक डेटा टाइप (एडीटी) निश्चित संख्या के नामित केसों को दर्शाता है। एडीटी की प्रत्येक वैल्यू इन नामित केसों में से ठीक एक केस से मेल खाती है।
एक एडीटी को data कीवर्ड से परिभाषित किया जाता है, और उसके केस पाइप (|) अक्षरों से अलग किए जाते हैं।
यदि किसी भी केस के साथ डेटा जुड़ा न हो, तो यह एडीटी वैसा ही होता है जिसे अन्य भाषाएँ आमतौर पर एन्यूमरेशन (या एनम) कहती हैं।
data Season
= Spring
| Summer
| Autumn
| Winter
एडीटी के प्रत्येक केस के साथ वैकल्पिक रूप से डेटा जुड़ा हो सकता है, और अलग-अलग केसों के साथ अलग-अलग प्रकार का डेटा जुड़ा हो सकता है। जब किसी केस के साथ डेटा जुड़ा हो, तो एक कंस्ट्रक्टर आवश्यक होता है।
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)।
चूँकि केसों के नाम केवल कंस्ट्रक्टर फंक्शन होते हैं, इसलिए जुड़ा हुआ डेटा एक सामान्य फंक्शन आर्गुमेंट की तरह दिया जा सकता है।
एडीटी में स्ट्रक्चरल इक्वालिटी होती है, जिसका अर्थ है कि एक ही केस की और समान (वैकल्पिक) डेटा वाली दो वैल्यू बराबर होती हैं।
हालाँकि एडीटी के साथ काम करने के लिए if/else एक्सप्रेशन इस्तेमाल किए जा सकते हैं, लेकिन इनके साथ काम करने का सुझाया गया तरीका case स्टेटमेंट का उपयोग करके पैटर्न मैचिंग है:
add1 :: Number -> String
add1 number =
case number of
NInt i -> show (i + 1)
NFloat f -> show (f + 1.0)
Invalid -> error "Invalid input"
इस अभ्यास में वैलेंटाइन डे है और आप योजना बना रहे हैं कि अपने साथी के साथ क्या करें। आपके साथी के पास ढेर सारे विचार हैं, और वह आपसे इन विचारों पर अपनी राय देने को कह रहा है, ताकि सबसे अच्छी गतिविधि चुनी जा सके।
आपके साथी ने ये विचार सुझाए हैं:
वैलेंटाइन डे की अपनी गतिविधि चुनने में मदद के लिए आपके सामने छह कार्य हैं।
आपके साथी जो भी विचार सुझाता है, उनमें से हर एक पर आप तीन विकल्पों में से एक चुनकर जवाब देते हैं: हाँ, नहीं या शायद।
इन विकल्पों को दर्शाने के लिए Approval एल्जेब्रिक डेटा टाइप बनाइए, जिसमें ये तीन केस होंगे: Yes, No या Maybe.
आपके साथी ने दो संभावित रेस्तरां चुने हैं: एक कोरियाई व्यंजन पर आधारित और दूसरा तुर्की व्यंजन पर।
इन रेस्तरां को दर्शाने के लिए Cuisine एल्जेब्रिक डेटा टाइप बनाइए, जिसमें ये दो केस होंगे: Korean या Turkish.
चुनने के लिए बहुत सारी फिल्में हैं, इसलिए विकल्पों को कम करने के लिए आपका साथी अपनी पसंदीदा शैली भी बता देता है।
इन शैलियों को दर्शाने के लिए Genre एल्जेब्रिक डेटा टाइप बनाइए, जिसमें ये केस होंगे: Crime, Horror, Romance या Thriller.
जैसा कि ऊपर बताया गया, आपके साथी ने पाँच संभावित गतिविधियाँ सुझाई हैं: बोर्ड गेम खेलना, आराम करना, फिल्म देखना, रेस्तरां जाना और टहलने जाना।
इन गतिविधियों के प्रकारों को दर्शाने के लिए Activity एल्जेब्रिक डेटा टाइप बनाइए:
BoardGame: इसके साथ कोई डेटा जुड़ा नहीं है।Chill: इसके साथ कोई डेटा जुड़ा नहीं है।Movie: इसके साथ इसका Genre डेटा जुड़ा है।Restaurant: इसके साथ इसका Cuisine डेटा जुड़ा है।Walk: इसके साथ एक Int डेटा जुड़ा है, जो चलने की दूरी को किलोमीटर में बताता है।अब आप अपने साथी के विचारों पर अपनी राय देने के लिए तैयार हैं। आपके साथी के विचार के बारे में आपकी राय यह है:
rateActivity नाम का एक फंक्शन बनाइए जो एक Activity वैल्यू लेता है और ऊपर बताई गई राय के आधार पर Approval लौटाता है।
उदाहरण के लिए:
rateActivity (Restaurant Turkish)
-- -> Maybe
Exercism पर साइन अप कीजिए और Haskell को 107 अभ्यास तथा असली इंसानों से मिलने वाली मेंटरिंग के साथ सीखिए और उसमें महारत हासिल कीजिए, वह भी बिल्कुल मुफ्त।