يمكن فحص أنواع 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 نوع خاص يجمع جميع الأنواع المدمجة التي يمكن مقارنتها: الأعداد والمحارف والسلاسل النصية والمصفوفات المكوّنة من عناصر قابلة للمقارنة والصفوف المكوّنة من عناصر قابلة للمقارنة.
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، ويمكن ترتيب مصفوفات القيم التي يمكن تحويلها إلى قيم قابلة للمقارنة باستخدام 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"
سجّل في Exercism لتتعلّم وتتقن Elm عبر 28 مفهومًا110 تمارين، وإرشاد بشري حقيقي، وكل ذلك مجانًا.