Haskell:
Використання асоціативних масивів
Як це зробити:
Haskell не має асоціативних масивів “з коробки” так само, як деякі інші мови, але він пропонує потужну стандартну бібліотеку під назвою Data.Map
для роботи з парами ключ-значення. Давайте згортати рукави та дізнаємось, як їх використовувати!
Спочатку переконайтеся, що ви її імпортували:
import qualified Data.Map as Map
Створення мапи просте. Створимо одну з деякими мовами програмування і їхніми парадигмами:
let languages = Map.fromList [("Haskell", "Функціональна"), ("Python", "Імперативна"), ("Prolog", "Логічна")]
А як щодо отримання парадигми Haskell?
Map.lookup "Haskell" languages
-- вивід: Just "Функціональна"
Додавання нової мови просто:
let languagesUpdated = Map.insert "Rust" "Системна" languages
А якщо ми хочемо перелічити всі мови? Використовуйте Map.keys
:
Map.keys languagesUpdated
-- вивід: ["Haskell","Python","Prolog","Rust"]
Щоб перелічити парадигми, використовуйте Map.elems
:
Map.elems languagesUpdated
-- вивід: ["Функціональна","Імперативна","Логічна","Системна"]
Ці базові операції повинні покрити більшість випадків використання, але в Data.Map
є багато чого ще для вивчення!
Поглиблене вивчення
Модуль Data.Map
в стандартній бібліотеці Haskell побудований на основі збалансованих бінарних дерев, зокрема, дерев AVL. Цей вибір гарантує, що більшість операцій над мапою, таких як вставка, видалення і пошук, можуть бути виконані за час O(log n), де n - кількість елементів у мапі. Це ефективний вибір для багатьох випадків використання, хоча і не найшвидший для всіх сценаріїв.
Існує також історична тонкість: до того, як Data.Map
став основним варіантом, програмісти Haskell часто використовували списки пар для імітації асоціативних масивів. Однак, операції над такими структурами є O(n) для пошуку, що робить Data.Map
значним поліпшенням з точки зору продуктивності.
Тепер, незважаючи на ефективність і корисність Data.Map
, це не завжди найкращий інструмент для кожного завдання. Для завдань, чутливих до производительності, де навіть часи пошуку O(log n) є занадто повільними, або де ключі завжди є цілочисельними значеннями, масиви або хеш-таблиці (через Data.HashMap
) можуть запропонувати кращу продуктивність з часом доступу O(1).
Екосистема Haskell дозволяє використовувати різноманітні структури даних для забезпечення різних потреб, і Data.Map
є відмінним вибором загального призначення для асоціативних масивів, гармонійно поєднуючи простоту використання, гнучкість і продуктивність.