Структуры данных List, Tuples и Record могут использоваться для хранения коллекции значений.
В этой главе обсуждается, как использовать List в Elm.
Список — это коллекция однородных значений. Все значения в списке должны быть одного типа данных.
Учитывайте следующие ограничения при использовании переменных для хранения значений:
-
Переменные имеют скалярный характер. Другими словами, во время объявления переменная может содержать только одно значение. Это означает, что для хранения n значений в программе потребуется n объявлений переменных. Следовательно, использование переменных неосуществимо, когда нужно хранить большую коллекцию значений.
-
Переменные в программе выделяются памяти в случайном порядке, что затрудняет получение / чтение значений в порядке их объявления.
Переменные имеют скалярный характер. Другими словами, во время объявления переменная может содержать только одно значение. Это означает, что для хранения n значений в программе потребуется n объявлений переменных. Следовательно, использование переменных неосуществимо, когда нужно хранить большую коллекцию значений.
Переменные в программе выделяются памяти в случайном порядке, что затрудняет получение / чтение значений в порядке их объявления.
Синтаксис
List_name = [value1,value2,value3.....valuen]
иллюстрация
В следующем примере показано, как использовать список в Elm. Попробуйте этот пример в elm REPL —
> myList1 = [10,20,30] [10,20,30] : List number > myList2 = ["hello","world"] ["hello","world"] : List String
Если мы попытаемся добавить значения разных типов в список, компилятор выдаст ошибку несоответствия типов. Это показано ниже.
> myList = [1,"hello"] -- TYPE MISMATCH --------------------------------------------- repl-temp-000.elm The 1st and 2nd entries in this list are different types of values. 4| [1,"hello"] ^^^^^^^ The 1st entry has this type: number But the 2nd is: String
Список операций
Следующая таблица показывает общие операции над списком —
Старший нет | метод | Описание |
---|---|---|
1 | isEmpty: Список a -> Bool | проверяет, пуст ли список |
2 | реверс: список a -> Bool | меняет список ввода |
3 | длина: список -> Int | возвращает размер списка |
4 | максимум: список сопоставим -> Может быть. Может быть сопоставим | возвращает максимальное значение |
5 | минимум: список сопоставим -> Может быть. Может быть сопоставим | возвращает минимальное значение |
6 | сумма: номер списка -> номер | возвращает сумму всех элементов в списке |
7 | продукт: список номер -> номер | проверяет, пуст ли список |
8 | сортировать: список сопоставимых -> список сопоставимых | сортировка списка в порядке возрастания |
9 | concat: Список (Список a) -> Список a | объединяет кучу списка в один |
10 | append: List a -> List a -> List a | объединяет два списка вместе |
11 | диапазон: Int -> Int -> List Int | возвращает список чисел от начала до конца |
12 | фильтр: (a -> Bool) -> List a -> List a | фильтрует список значений из списка ввода |
13 | руководитель: Список -> Возможно. Может быть | возвращает первый элемент из списка |
14 | tail:: Список a -> Maybe.Maybe (Список a) | возвращает все элементы, кроме головы |
пустой
Эта функция возвращает true, если список пуст.
Синтаксис
List.isEmpty list_name
Чтобы проверить сигнатуру функции, наберите следующее в elm REPL —
> List.isEmpty <function> : List a -> Bool
иллюстрация
> List.isEmpty <function> : List a -> Bool > List.isEmpty [10,20,30] False : Bool
задний ход
Эта функция переворачивает список.
Синтаксис
List.reverse list_name
Чтобы проверить сигнатуру функции, наберите следующее в elm REPL —
> List.reverse <function> : List a -> List a
иллюстрация
> List.reverse [10,20,30] [30,20,10] : List number
длина
Эта функция возвращает длину списка.
Синтаксис
List.length list_name
Чтобы проверить сигнатуру функции, наберите следующее в elm REPL —
> List.length <function> : List a -> Int
иллюстрация
> List.length [10,20,30] 3 : Int
максимальная
Эта функция возвращает максимальный элемент в непустом списке.
Синтаксис
List.maximum list_name
Чтобы проверить сигнатуру функции, наберите следующее в elm REPL —
> List.maximum <function> : List comparable -> Maybe.Maybe comparable
иллюстрация
> List.maximum [10,20,30] Just 30 : Maybe.Maybe number > List.maximum [] Nothing : Maybe.Maybe comparable
минимальный
Эта функция возвращает минимальный элемент в непустом списке.
Синтаксис
List.minimum list_name
Чтобы проверить сигнатуру функции, наберите следующее в elm REPL —
> List.minimum <function> : List comparable -> Maybe.Maybe comparable
иллюстрация
> List.minimum [10,20,30] Just 10 : Maybe.Maybe number
сумма
Эта функция возвращает сумму всех элементов в списке.
Синтаксис
List.sum list_name
Чтобы проверить сигнатуру функции, наберите следующее в elm REPL —
> List.sum <function> : List number -> number
иллюстрация
> List.sum [10,20,30] 60 : number
товар
Эта функция возвращает произведение всех элементов в списке.
Синтаксис
List.product list_name
Чтобы проверить сигнатуру функции, наберите следующее в elm REPL —
<function> : List number -> number
иллюстрация
List.product [10,20,30] 6000 : number
Сортировать
Эта функция сортирует значения от самого низкого до самого высокого в списке.
Синтаксис
List.sort list_name
Чтобы проверить сигнатуру функции, наберите следующее в elm REPL —
> List.sort <function> : List comparable -> List comparable
иллюстрация
> List.sort [10,20,30] [10,20,30] : List number
CONCAT
Эта функция объединяет несколько списков в один список.
Синтаксис
List.concat [ [list_name1],[list_name2],[list_name3],.....[list_nameN] ]
Чтобы проверить сигнатуру функции, наберите следующее в elm REPL —
> List.concat <function> : List (List a) -> List a
иллюстрация
> List.concat [[10,20], [30,40],[50,60]] [10,20,30,40,50,60] : List number
присоединять
Эта функция объединяет два списка.
Синтаксис
List.append [list_name1] [list_name2]
Чтобы проверить сигнатуру функции, наберите следующее в elm REPL —
> List.append <function> : List a -> List a -> List a
иллюстрация
> List.append [10,20] [30,40] [10,20,30,40] : List number
Оператор ++ также можно использовать для добавления списка в другой. Это показано в примере ниже —
> [10.1,20.2] ++ [30.3,40.4] [10.1,20.2,30.3,40.4] : List Float
спектр
Эта функция создает список чисел, каждый элемент увеличивается на единицу. Наименьшее и наибольшее число, которое должно быть в списке, передается функции.
Синтаксис
List.range start_range end_range
Чтобы проверить сигнатуру функции, наберите следующее в elm REPL —
> List.range <function> : Int -> Int -> List Int
иллюстрация
> List.range 1 10 [1,2,3,4,5,6,7,8,9,10] : List Int
фильтр
Эта функция фильтрует набор значений из списка ввода. Сохраняйте только те значения, которые проходят тест.
Синтаксис
List.filter test_function input_list
Чтобы проверить сигнатуру функции, наберите следующее в elm REPL —
> List.filter <function> : (a -> Bool) -> List a -> List a
иллюстрация
Следующий пример фильтрует все четные числа из списка ввода
> List.filter (\n -> n%2==0) [10,20,30,55] [10,20,30] : List Int
голова
Эта функция возвращает первый элемент из списка ввода.
Синтаксис
List.head input_list
Чтобы проверить сигнатуру функции, наберите следующее в elm REPL —
> List.head <function> : List a -> Maybe.Maybe a
иллюстрация
> List.head [10,20,30,40] Just 10 : Maybe.Maybe number > List.head [] Nothing : Maybe.Maybe a
хвост
Эта функция возвращает все элементы после первого в списке.
Синтаксис
List.tail input_list
Чтобы проверить сигнатуру функции, наберите следующее в elm REPL —
> List.tail <function> : List a -> Maybe.Maybe (List a)
иллюстрация
> List.tail [10,20,30,40,50] Just [20,30,40,50] : Maybe.Maybe (List number) > List.tail [10] Just [] : Maybe.Maybe (List number) > List.tail [] Nothing : Maybe.Maybe (List a)
Использование оператора Cons
Оператор cons (::) добавляет элемент в начало списка.
иллюстрация
> 10::[20,30,40,50] [10,20,30,40,50] : List number
Добавляемый новый элемент и тип данных значений в списке должны совпадать. Компилятор выдает ошибку, если типы данных не совпадают.
> [1,2,3,4]::[5,6,7,8] -- TYPE MISMATCH --------------------------------- ------------ repl-temp-000.elm The right side of (::) is causing a type mismatch. 3| [1,2,3,4]::[5,6,7,8] ^^^^^^^^^ (::) is expecting the right side to be a: List (List number) But the right side is: List number Hint: With operators like (::) I always check the left side first. If it seems fine, I assume it is correct and check the right side. So the problem may be in how the left and right arguments interact.
Списки неизменны
Давайте проверим, являются ли списки неизменными в Elm. Первый список myList при объединении со значением 1 создает новый список и возвращается в myListCopy . Поэтому, если мы отобразим начальный список, его значения не будут изменены.