Set a - це послідовність унікальних значень типу a.
Значення мають бути типу comparable (Int, Float, Time, Char, String, а також кортежі або масиви порівнюваних типів).
Масиви та множини можна перетворювати одне в одного за допомогою Set.toList і Set.fromList.
Через внутрішню структуру Set гарантовано, що масив, отриманий з Set.fromList, буде відсортовано.
Set.fromList [2, 3, 3, 3, 1, 1, 2]
--> Set.fromList [1, 2, 3]
Set.toList (Set.fromList [2, 3, 3, 3, 1, 1, 2])
--> [1, 2, 3]
Створювати та наповнювати множини можна за допомогою Set.empty, Set.singleton, Set.insert і Set.remove.
Set.empty
--> Set.fromList []
Set.singleton "hi"
--> Set.fromList ["hi"]
eightyEight = Set.singleton 88
Set.insert 88 eightyEight
--> Set.fromList [88]
Set.insert 89 eightyEight
--> Set.fromList [88, 89]
Set.remove 88 eightyEight
--> Set.fromList []
Set.remove 89 eightyEight
--> Set.fromList [88]
За допомогою функцій Set.member, Set.isEmpty і Set.size можна дізнаватися про вміст множини.
Set.member 88 eightyEight
--> True
Set.isEmpty eightyEight
--> False
Set.size eightyEight
--> 1
Множини можна обʼєднувати за допомогою Set.union, Set.intersect і Set.diff.
a = Set.fromList [1, 10, 100]
b = Set.fromList [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
Set.union a b
--> Set.fromList [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 100]
Set.intersect a b
--> Set.fromList [1, 10]
Set.diff a b
--> Set.fromList [100]
Set.diff b a
--> Set.fromList [2, 3, 4, 5, 6, 7, 8, 9]
Множини можна фільтрувати та розподіляти.
even n = modBy 2 n == 0
Set.filter even b
--> Set.fromList [2, 4, 6, 8, 10]
Set.partition even b
--> (Set.fromList [2, 4, 6, 8, 10], Set.fromList [1, 3, 5, 7, 9])
Наша ностальгія за картками Blorkemon™️ і не думає вщухати: ми навіть знову почали їх збирати й залучаємо до цього друзів.
У цій вправі колекція Card представлена типом Set Card, адже коли наша мета - зібрати всі наявні картки, дублікати не мають значення.
Нам дуже хочеться, щоб друзі долучилися до нашого божевілля з Blorkemon™️, і найкращий спосіб - запустити їхню колекцію, подарувавши їм одну картку.
Реалізуйте newCollection, яка перетворює картку на колекцію.
newCollection "Newthree"
--> Set.fromList ["Newthree"]
Коли колекція вже є, вона починає жити власним життям і мусить рости.
Реалізуйте addCard, яка приймає Card і колекцію та повертає Tuple з двома значеннями: Bool, що вказує, чи картка вже була в колекції, і колекцію з доданою карткою.
addCard "Scientuna" (Set.fromList ["Newthree"])
--> (False, Set.fromList ["Newthree", "Scientuna"])
Тепер, коли наші друзі знову божеволіють від Blorkemon™️, ми можемо скористатися цим, щоб примножити власну колекцію, обмінюючись картками.
Не кожен обмін варто робити, а деякі взагалі неможливі. Не можна обміняти картку, якої в нас немає, і не варто віддавати картку за ту, яка в нас уже є.
Реалізуйте tradeCard, яка приймає дві картки для обміну (нашу й чужу) і нашу поточну колекцію.
Повернене значення - це Tuple з двох значень: Bool, який указує, чи обмін можливий і чи вартий він того, і колекція, яка була б у нас у результаті обміну (навіть якщо насправді він неможливий).
tradeCard "Scientuna" "Newthree" (Set.fromList ["Scientuna"])
--> (True, Set.fromList ["Newthree"])
Ми знаходимо старий запас карток на блошиному ринку. Потрібно відсортувати картки й прибрати дублікати, щоб порівняти список зі своєю колекцією.
Реалізуйте removeDuplicates, яка сортує список карток і повертає список відсортованих унікальних карток.
removeDuplicates ["Newthree", "Newthree", "Newthree", "Scientuna"]
--> ["Newthree", "Scientuna"]
Час пишатися своєю колекцією.
Реалізуйте extraCards, яка приймає нашу колекцію та якусь іншу колекцію і повертає кількість карток, яких немає в іншій колекції.
extraCards (Set.fromList ["Scientuna"]) (Set.fromList ["Newthree", "Scientuna"])
--> 0
Ми збираємося з друзями-ентузіастами Blorkemon™️ і міркуємо, які картки найпоширеніші.
Реалізуйте boringCards, яка приймає список колекцій і повертає список відсортованих карток, які є в усіх колекціях.
boringCards [Set.fromList ["Scientuna"], Set.fromList ["Newthree", "Scientuna"]]
--> ["Scientuna"]
Чи володіємо ми з друзями разом усіма картками Blorkemon™️?
Реалізуйте totalCards, яка приймає список колекцій і повертає загальну кількість різних карток у всіх колекціях.
totalCards [Set.fromList ["Scientuna"], Set.fromList ["Newthree", "Scientuna"]]
--> 2
Скоро до нас у гості приїде наш племінник, і хочеться його вразити. Діти ж люблять усе блискуче, правда? А картки Blorkemon™️ бувають блискучими!
Реалізуйте splitShinyCards, яка приймає колекцію та повертає Tuple з двома списками відсортованих карток: один з усіма картками, що починаються на "Shiny", і один з рештою карток.
splitShinyCards (Set.fromList ["Newthree", "Scientuna", "Shiny Scientuna"])
--> (["Shiny Scientuna"], ["Newthree", "Scientuna"])
Зареєструйтеся на Exercism, щоб вивчати й опановувати Elm, а також 28 концепцій110 вправ та справжнє наставництво від людей, і все це безкоштовно.