با عملگر برابری (==) میتوان انواع Elm را از نظر «یکسان بودن» بررسی کرد.
عملگر نابرابری (/=) است (نه != مانند بسیاری از زبانها).
عملگر برابری روی لیترالها، تاپلها، رکوردها و انواع سفارشی کار میکند.
1 == 2
--> False
1 /= 2
--> True
(1, 2) == (2, 1)
--> False
type alias MyRecord = { myInt : Int, myStrings : List String }
a : MyRecord
a = MyRecord (1 + 1) ["hello world"]
type alias MyOtherRecord = { myInt : Int, myStrings : List String }
myStrings = (String.join " " ["hello", "world"]) :: []
b : MyOtherRecord
b = { myInt = 2, myStrings = myStrings}
a == b
--> True
توجه کنید که هرگز نباید توابع را مقایسه کنید، چون این کار باعث میشود برنامه در زمان اجرا از کار بیفتد.
عملگرهای مقایسهی (<)، (<=)، (>)، (>=) و توابع min، max و compare روی انواع comparable کار میکنند.
نوع comparable یک نوع ویژه است که همهی انواع توکاری را که قابل مقایسهاند در خود گرد میآورد: اعداد، نویسهها، رشتهها، لیستهایی از مقدارهای comparable و تاپلهایی از مقدارهای comparable.
1 < 1 + 1
--> True
'x' < 'X'
--> False
"abc" < "abz"
--> True
"abc" < "abcd"
--> True
"abc" < "b"
--> True
min [1 , 2, 9000] [10]
--> [1 , 2, 9000]
min (1, "hello") (3, "bye")
--> (1, "hello")
مقدارهای انواع دیگر مانند رکوردها یا انواع سفارشی را نمیتوان مستقیماً مقایسه کرد.
برخی انواع توکار نیاز دارند که محتوایشان comparable باشد، مانند کلیدهای Set یا Dict، چون ساختارشان به یک ترتیب درونی وابسته است.
لیستهای مقدارهای comparable را میتوان با List.sort مرتب کرد و لیستهای مقدارهایی که میتوان آنها را به مقدارهای comparable نگاشت، با List.sortBy مرتب میشوند.
اگر به مرتبسازی سلسلهمراتبی نیاز دارید (مرتبسازی بر اساس یک ویژگی و شکستن تساوی با ویژگی دیگر)، میتوان از تاپلها یا لیستها هم همراه با List.sortBy استفاده کرد، چون تاپلها و لیستها به ترتیب لغتنامهای مرتب میشوند.
List.sort ["hi", "hello", "bye", "goodbye"]
--> ["bye", "goodbye", "hello", "hi"]
List.sortBy String.length ["hi", "hello", "bye", "goodbye"]
--> ["hi", "bye", "hello", "goodbye"]
-- sort by length, then alphabetically
List.sortBy (\str -> (String.length str, str)) ["hi", "mum", "hello", "sis", "bye", "dad"]
--> ["hi", "bye", "dad", "mum", "sis", "hello"]
تابع compare دو مقدار comparable میگیرد و یک Order برمیگرداند.
Order نوعی است که در یک عملیات واحد بررسی میکند یک مقدار بزرگتر (GT)، برابر (EQ) یا کوچکتر (LT) از دیگری است.
compare 1 2
--> LT
compare "" ""
--> EQ
compare [12] []
--> GT
میتوان توابع مقایسه را برای انواع دلخواه ساخت و مثلاً از آنها برای مرتبسازی با List.sortWith استفاده کرد:
type Color = Red | Green | Blue
compareColors : Color -> Color -> Order
compareColors a b =
case (a, b) of
(Red, Red) -> EQ
(Red, _) -> LT
(_, Red) -> GT
(Green, Green) -> EQ
(Green, _) -> LT
(_, Green) -> GT
(Blue, Blue) -> EQ
List.sortWith compareColors [Blue, Red, Green, Green, Blue]
--> [Red, Green, Green, Blue, Blue]
ناگهان موجی از نوستالژی به شما دست میدهد و دلتان میخواهد کارتهای قدیمی Blorkemon™️ خود را از گرد و غبار پاک کنید.
بازی کارتهای Blorkemon™️ یک بازی مبادلهی کارت معرکه و قدیمی است.
روی هر Card یک هیولای Blorkemon™️ رسم شده است، همراه با یک سطح قدرت حمله. اگر خوششانس باشید، ممکن است کارت حتی درخشان هم باشد.
هر کارت Blorkemon™️ از کارت بعدی قدرتمندتر به نظر میرسد، اما بهتر است بررسی کنید.
تابع isMorePowerful را پیادهسازی کنید. اگر کارتی که در آرگومان اول آمده اکیداً از دیگری قدرتمندتر باشد، باید True را برگرداند، در غیر این صورت False.
newthree = Card "Newthree" 120 False
scientuna = Card "Scientuna" 6 True
isMorePowerful newthree scientuna
--> True
با دستی پر از کارتهای Blorkemon™️، باید بتوانید ویرانکنندهترین حمله را آماده کنید.
تابع maxPower را پیادهسازی کنید که بیشترین سطح قدرت میان دو کارت را برمیگرداند.
maxPower newthree scientuna
--> 120
به نظر میرسد یادتان میآید که از هر Blorkemon™️ حداقل یک کارت داشتید، اما مدتی از آخرین باری که بررسی کردید گذشته است. بهتر است کارتهایتان را مرتب کنید تا آنها را با فهرست رسمی Pulpapedia مقایسه کنید.
تابع sortByMonsterName را پیادهسازی کنید که باید فهرستی از Cards بگیرد و فهرستی مرتبشده بر اساس اسم هیولاها برگرداند.
sortByMonsterName [newthree, scientuna]
--> [Card "Newthree" 120 False, Card "Scientuna" 6 True]
Blorkemon™️ از همه باحالترند. این حرف را سرسری نمیزنید؛ برای اثباتش یک روش علمی دارید.
تابع sortByCoolness را پیادهسازی کنید که فهرستی از کارتها را طوری مرتب میکند که باحالترینها اول بیایند.
باحالی یک کارت اول بر اساس درخشندگیاش تعیین میشود: همهی کارتهای درخشان از بقیه بسیار باحالترند.
عامل دوم سطح قدرت است؛ هرچه بالاتر، بهتر.
sortByCoolness [newthree, scientuna]
--> [Card "Scientuna" 6 True, Card "Newthree" 120 False]
درخشندگی فقط برای خودنمایی نیست؛ در نبردی میان Blorkemon™️هایی با قدرت برابر، همیشه آن که درخشان است پیروز میشود. به این «قدرت درخشان» میگویند.
تابع compareShinyPower را پیادهسازی کنید که این ویژگی را به قاعده تبدیل میکند.
Order دو کارت، اگر سطح قدرتشان متفاوت باشد، بر اساس همان تعیین میشود؛ اما اگر برابر باشند، کارت درخشان بزرگتر خواهد بود.
compareShinyPower newthree scientuna
--> GT
در بازی کارتهای Blorkemon™️ قاعدهی مشخصی وجود ندارد، اما هنوز این گرایش هست که کارتهای قدرتمندتر برنده شوند.
تابع expectedWinner را پیادهسازی کنید که اسم هیولایی را برمیگرداند که بیشتر از همه انتظار میرود برنده شود، بر اساس ترتیبی که compareShinyPower تعیین میکند.
تابع باید اسم هیولای برندهی مورد انتظار را برگرداند، یا اگر هر دو حریف قدرت درخشان یکسانی داشته باشند، «too close to call».
expectedWinner newthree scientuna
--> "Newthree"