Множество

Во многих языках функционального программирования List - одна из наиболее распространенных структур данных для работы с данными. Связанный список имеет лучшую производительность для выполнения операций рекурсии, когда вы извлекаете элементы по одному, имея дело с большим количеством обходов. Это распространено среди других языков функционального программирования, таких как Haskell, Elixir и Clojure. Неизменяемый связанный список, как правило, легче работать

Однако бывают случаи, когда вам нужно использовать массив вместо связанного списка. В этом разделе я расскажу о некоторых случаях использования Array в Elm.

Получение определенного проиндексированного элемента

Array.fromList преобразует список в массив.

myArray: Array Int
myArray =
Array.fromList [ 5, 10, 15, 20]

Array.get возвращает Только элемент по индексу или Ничего, если индекс выходит за пределы допустимого диапазона.

Array.get 2 myArray
Just 15
Array.get 4 myArray
> Nothing

В списке нет функции get для получения некоторого элемента по определенному индексу. Это потому, что, вообще говоря, если вам нужен конкретный элемент из списка, массивы больше подходят, чем связанный список. Получение значения в произвольной позиции в связанном списке имеет сложность выполнения O (N), и это может быть медленным. В Array для доступа к значению по определенному индексу требуется O (1) постоянной сложности выполнения, что делает его намного быстрее, чем связанный список.

Если вы работаете с данными, где вам регулярно требуется доступ к индексированному элементу, то правильной структурой данных для использования будет массив.

В массиве добавление элемента в начало обходится дешевле, а добавление в заднюю часть массива - дешевле. Чтение любого элемента очень дешево ** O (N) **, а удаление первого элемента - дорогое удовольствие

Диктовать

Словарь сопоставляет уникальные ключи со значениями. Ключи могут быть любого сопоставимого типа. Сюда входят Int, Float, Time, Char, String, а также кортежи или списки сопоставимых типов.

foodsNCals : Dict String Int
foodsNCals = 
 Dict.fromList
 [ ( “Salad”, 70)
 , ( “Sweet Potato Baked”, 110)
 , ( “Quinoa”, 90)
 ]

В приведенном выше примере это `Dict String Int`, у него есть строковые ключи и целочисленные значения. Это карта здорового питания и соответствующих калорий.

Рекорды 101

В Elm запись - это облегченная помеченная структура данных. Записи в Elm очень похожи на объекты в JavaScript. Основные отличия заключаются в том, что с записями: в elm вы не можете запрашивать поле, которое не существует, ни одно поле никогда не будет undefined или null, и вы не можете создавать рекурсивные записи с ключевым словом this или self.

Records vs Dict

В Records нельзя выполнять итерации по ним, смотреть их ключи и значения. С помощью dicts вы можете получить список всех ключей и значений. Вы можете добавлять и удалять вещи из Dict.

В записях вы можете смешивать и сопоставлять типы. Dict должен иметь одинаковые типы, то есть все ключи и значения должны иметь одинаковые типы. В примере foodNCals все ключи food должны иметь тип String, а все значения калорий должны иметь тип Int.

Стандартные операции в Dict

Dict.insert: вставьте пару "ключ-значение" в словарь. Заменяет значение при столкновении.

newDict = Dict.insert “Bananas” 70 foodsNCals
 == Dict.fromList
 [ ( “Salad”, 70)
 , ( “Sweet Potato Baked”, 110)
 , ( “Quinoa”, 90)
 , ( “Bananas”, 70)
 ]

Dict.get: получает значение, связанное с ключом. Если ключ не найден, верните Nothing. Это полезно, если вы не уверены, будет ли ключ в словаре.

Dict.get “Salad” foodsNCals == Just 70
Dict.get “Sweet Potato Baked” foodsNCals == Just 110
Dict.get “Mangoes” foodsNCals == Nothing```

Dict.remove: удаляет пару "ключ-значение" из словаря. Если ключ не найден, изменения не вносятся.

Dict.remove “Salad” foodsNCals
 == Dict.fromList
 [ ( “Sweet Potato Baked”, 110)
 , ( “Quinoa”, 90)
 ]

Рендеринг с диктатора

Преобразование Dict в список

Dict.values: Dict.values ​​получает все значения в словаре в порядке их ключей.

Dict.values foodsNCals == [ 70, 110, 90]

Получив список значений из dict, вы можете выполнить List.sortBy для управления списком. Это очень мощный инструмент, который дает вам полный контроль над вашими данными.

Соображения производительности и компромиссы

С точки зрения производительности Dict.remove со сложностью выполнения O (log n) значительно лучше с точки зрения скорости, чем использование List.filter, время выполнения которого O (п).

Компромисс здесь в том, что если мы переключаемся со списка на Dict, с точки зрения рендеринга, это происходит медленнее. Теперь нам нужно взять Dict, преобразовать его в значения, а затем отсортировать эти значения.

Это большая работа, чем если бы у вас уже есть список. С другой стороны, удаление из Dict обходится дешевле.