یک نوع دادهی جبری (ADT) تعدادی ثابت از حالتهای نامدار را نمایش میدهد. هر مقدار از یک ADT دقیقاً با یکی از حالتهای نامدار متناظر است.
ADT با کلیدواژهی data تعریف میشود و حالتهای آن با کاراکتر خط عمودی (|) از هم جدا میشوند.
اگر هیچیک از حالتها دادهی وابستهای نداشته باشند، این ADT شبیه چیزی است که زبانهای دیگر معمولاً شمارشی (یا enum) مینامند.
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 استفاده کرد، روش توصیهشده برای کار با آنها، «تطبیق الگو» با استفاده از دستور case است:
add1 :: Number -> String
add1 number =
case number of
NInt i -> show (i + 1)
NFloat f -> show (f + 1.0)
Invalid -> error "Invalid input"