يمثل نوع البيانات الجبري (ADT) عددًا ثابتًا من الحالات المسماة. وكل قيمة من قيم نوع البيانات الجبري تقابل حالة واحدة بالضبط من الحالات المسماة.
يُعرّف نوع البيانات الجبري باستخدام الكلمة المفتاحية data، مع فصل الحالات بمحرف الأنبوب (|).
إذا لم تكن مرتبطة بأي من الحالات بيانات، فإن نوع البيانات الجبري يشبه ما تسميه اللغات الأخرى عادةً تعدادًا (أو enum).
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 تمارين، وإرشاد بشري حقيقي، وكل ذلك مجانًا.