Типи 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 - це особливий тип, який обʼєднує всі вбудовані типи, які можна порівнювати: числа, символи, рядки тексту (англ. string), масиви порівнюваних значень і кортежі порівнюваних значень.
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 вправ та справжнє наставництво від людей, і все це безкоштовно.