نوع Maybe راهحل زبان Elm برای مقادیر اختیاری است. بنابراین در امضای نوع بسیاری از توابع اصلی Elm دیده میشود و درک آن اهمیت زیادی دارد. نوع Maybe به شکل زیر تعریف شده است:
type Maybe a = Nothing | Just a
در اصطلاحات Elm، به این کار تعریف «نوع سفارشی» میگویند. این تعریف نشان میدهد که مقدارِ این نوع یا Nothing است یا Just یک مقدار از نوع a. ساختن یک مقدار Maybe با یکی از دو سازندهی آن، Nothing و Just، انجام میشود. خواندن محتوای یک Maybe هم با تطبیق الگو انجام میشود.
matthieu : Maybe String
matthieu = Just "Matthieu"
anon : Maybe String
anon = Nothing
sayHello : Maybe String -> String
sayHello maybeName =
case maybeName of
Nothing -> "Hello, World!"
Just someName -> "Hello, " ++ someName ++ "!"
sayHello matthieu
--> "Hello, Matthieu!"
sayHello anon
--> "Hello, World!"
همچنین چندین تابع مفید در ماژول Maybe وجود دارد که برای کار با نوع Maybe به کار میروند.
sayHelloAgain : Maybe String -> String
sayHelloAgain name = "Hello, " ++ Maybe.withDefault "World" name ++ "!"
capitalizeName : Maybe String -> Maybe String
capitalizeName name = Maybe.map String.toUpper name
capitalizeName matthieu
--> Just "MATTHIEU"
capitalizeName anon
--> Nothing
در این تمرین، مکانیزمهای یک بازی نقشآفرینی را پیادهسازی میکنید. شخصیت یک بازیکن با نوع زیر نمایش داده میشود:
type alias Player =
{ name : Maybe String
, level : Int
, health : Int
, mana : Maybe Int
}
بازیکنان این بازی باید به سطح ۱۰ برسند تا مخزن مانا را باز کنند و بتوانند اجرای طلسم را آغاز کنند. شما روی دو بخش از قابلیتهای این بازی کار میکنید: مکانیزم احیا و مکانیزم اجرای طلسم.
محتوای تابع introduce را بنویسید.
بازیکنان پنهانکار ممکن است اسمشان را مخفی کرده باشند و با "Mighty Magician" معرفی شوند.
در غیر این صورت، فقط با اسم خودتان معرفی کنید.
introduce { name = Nothing, level = 2, health = 8, mana = Nothing }
--> "Mighty Magician"
introduce { name = Just "Merlin", level = 2, health = 8, mana = Nothing }
--> "Merlin"
تابع revive باید بررسی کند که شخصیت بازیکن واقعاً مرده است (سلامتیاش به ۰ رسیده است).
اگر مرده باشد، باید یک نمونهی جدید از Player با ۱۰۰ سلامتی برگرداند.
در غیر این صورت، اگر شخصیت بازیکن مرده نباشد، تابع revive مقدار Nothing را برمیگرداند.
اگر سطح بازیکن ۱۰ یا بالاتر باشد، باید با ۱۰۰ مانا هم احیا شود.
اگر سطح بازیکن کمتر از ۱۰ باشد، مانای او باید Nothing باشد.
تابع revive باید سطح بازیکن را حفظ کند.
deadPlayer = { name = Nothing, level = 2, health = 0, mana = Nothing }
revive deadPlayer
--> Just { name = Nothing, level = 2, health = 100, mana = Nothing }
اگر متد revive روی بازیکنی فراخوانی شود که سلامتیاش ۱ یا بالاتر است، تابع باید Nothing را برگرداند.
alivePlayer = { name = Nothing, level = 2, health = 42, mana = Nothing }
revive alivePlayer
--> Nothing
تابع castSpell به عنوان آرگومان یک Int میگیرد که نشان میدهد طلسم چقدر مانا هزینه دارد، و همچنین یک Player.
این تابع بازیکن بهروزشده و همچنین مقدار آسیبی که طلسم اجراشده وارد میکند را برمیگرداند.
یک اجرای موفق طلسم، آسیبی برابر با دو برابر هزینهی مانای طلسم وارد میکند.
اما اگر بازیکن مانای کافی نداشته باشد، هیچ اتفاقی نمیافتد، بازیکن تغییری نمیکند و هیچ آسیبی وارد نمیشود.
اگر بازیکن حتی مخزن مانا هم نداشته باشد، تلاش برای اجرای طلسم باید سلامتیاش را به اندازهی هزینهی مانای طلسم کاهش دهد و هیچ آسیبی وارد نمیکند.
wizard = { name = Nothing, level = 18, health = 123, mana = Just 30 }
( updatedWizard, damage ) = castSpell 14 wizard
updatedWizard.mana --> Just 16
damage --> 28