نوع سفارشی در Elm از تعداد ثابتی از حالتهای نامدار تشکیل شده است. هر مقدار دقیقاً با یکی از حالتهای نامدار متناظر است.
نوع سفارشی با کلیدواژهی type تعریف میشود و نحوهی نگارش مورد نیازش بسیار اندک است. این نوعها یکی از مهمترین تکنیکهای برنامهنویسی در Elm هستند و برای این به کار میروند که مقادیر ممکن در کد دقیقاً با مقادیر معتبر در دنیای واقعی مطابقت داشته باشند، که هیچ جایی برای دادهی نامعتبر باقی نمیگذارد و حالتهای ناممکن را در کد غیرقابل نمایش میکند.
type Season
= Spring
| Summer
| Autumn
| Winter
هر حالت از یک نوع سفارشی میتواند بهصورت اختیاری دادهای متناظر با خود داشته باشد و حالتهای مختلف میتوانند انواع دادهی متفاوتی داشته باشند. اگر هیچیک از حالتها دادهای نداشته باشند، اجتماع تفکیکشده مشابه چیزی است که سایر زبانها معمولاً از آن بهعنوان enumeration (یا enum) یاد میکنند.
type FlexibleNumber
= Integer Int
| Float Float
| Invalid
ایجاد یک مقدار برای یک حالت مشخص میتواند با ارجاع به نام آن انجام شود (Spring)، وقتی که در همان ماژول تعریف شده باشد یا با نحوهی نگارش import SeasonModule exposing (Season(..)) وارد شده باشد، یا با ارجاع به نام کاملاً واجد شرایط آن (Season.Spring) وقتی با نحوهی نگارش import SeasonModule exposing (Season) وارد شده باشد.
integerTwo = Integer 2
invalid = FlexibleNumber.Invalid
نوع سفارشی، همراه با همه چیز در Elm، دارای «برابری ساختاری» است؛ یعنی دو مقدار برای یک حالت مشابه و با دادهی (اختیاری) یکسان، معادل هستند.
راه ترجیحی برای کار با نوع سفارشی تطبیق الگو است:
let describe flexibleNumber =
case flexibleNumber of
Integer i ->
"Integer: " ++ fromInt(i)
Float f ->
"Float: " ++ fromFloat(f)
Invalid ->
"Invalid"
در این تمرین، روز ولنتاین است و شما و شریکتان قصد دارید با هم کار قشنگی انجام دهید. شریک شما ایدههای زیادی دارد و حالا از شما میخواهد که آن ایدهها را امتیازدهی کنید تا فعالیتی را که قرار است انجام دهید پیدا کنید.
شریک شما ایدههای زیر را پیشنهاد داده است:
شش کار برای شما هست که به انتخاب فعالیت روز ولنتاین کمک میکند.
Approval
برای هر ایدهای که شریک شما پیشنهاد میدهد، با یکی از سه گزینه پاسخ میدهید: yes، no یا maybe.
نوع سفارشی Approval را طوری تعریف کنید که این گزینهها را بهصورت سه حالت زیر نمایش دهد: Yes، No و Maybe.
Cuisine
شریک شما دو رستوران ممکن را انتخاب کرده است: یکی با آشپزی کرهای و دیگری با آشپزی ترکی.
نوع سفارشی Cuisine را طوری تعریف کنید که این آشپزیها را بهصورت دو حالت زیر نمایش دهد: Korean و Turkish.
Genre
فیلمهای بیشماری برای انتخاب وجود دارد، پس شریک شما برای اینکه انتخاب را محدودتر کند، ژانر آنها را هم فهرست میکند.
نوع سفارشی Genre را تعریف کنید تا ژانرهای زیر را بهصورت حالت نمایش دهد: Crime، Horror، Romance و Thriller.
Activity
همانطور که گفته شد، شریک شما پنج فعالیت مختلف به ذهنش رسیده است: بازی رومیزی بازی کردن، استراحت کردن، تماشای فیلم و رفتن به رستوران.
نوع سفارشی Activity را تعریف کنید تا این انواع فعالیت را نمایش دهد:
BoardGame: بدون دادهی همراه.Chill: بدون دادهی همراه.Movie: دارای Genre بهعنوان دادهی همراه.Restaurant: دارای Cuisine بهعنوان دادهی همراه.Activity
در نهایت، آمادهاید که به ایدههای شریکتان امتیاز بدهید. نظر شما دربارهی ایدهی شریکتان این است:
تابعی به اسم rateActivity پیادهسازی کنید که یک مقدار Activity میگیرد و بر اساس احساسات بالا Approval را برمیگرداند:
rateActivity (Restaurant Turkish)
-- => Maybe