Maybe টাইপটি Elm ভাষায় ঐচ্ছিক মানের জন্য সমাধান। তাই এটি Elm-এর অনেক কোর ফাংশনের টাইপ সিগনেচারে উপস্থিত, আর এটি বোঝা খুবই জরুরি। Maybe টাইপটি এভাবে ডিফাইন করা হয়েছে:
type Maybe a = Nothing | Just a
Elm-এর পরিভাষায় এটিকে "কাস্টম টাইপ" ডেফিনিশন বলা হয়। এটি বোঝায় যে এই টাইপের একটি মান হয় Nothing হতে পারে, নয়তো টাইপ a-এর কোনো কিছু নিয়ে Just হতে পারে। 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
Exercism-এ সাইন আপ করুন, Elm ট্র্যাকের 28টি কনসেপ্ট110টি অনুশীলনী আর সত্যিকারের মানুষের মেন্টরিং দিয়ে শিখুন ও দক্ষ হয়ে উঠুন, সম্পূর্ণ বিনামূল্যে।