Учебники

Вяз — Список

Структуры данных 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 . Поэтому, если мы отобразим начальный список, его значения не будут изменены.