Wiąz - Lista

Struktury danych Lista, Krotki i Rekord mogą służyć do przechowywania zbioru wartości.

W tym rozdziale omówiono, jak używać listy w aplikacji Elm.

Lista to zbiór jednorodnych wartości. Wszystkie wartości na liście muszą mieć ten sam typ danych.

Weź pod uwagę następujące ograniczenia podczas używania zmiennych do przechowywania wartości -

  • Zmienne mają charakter skalarny. Innymi słowy, w momencie deklaracji zmienna może mieć tylko jedną wartość. Oznacza to, że aby zapisać w programie n wartości, potrzebnych będzie n deklaracji zmiennych. Dlatego użycie zmiennych jest niewykonalne, gdy trzeba przechowywać większy zbiór wartości.

  • Zmiennym w programie przydzielana jest pamięć w kolejności losowej, co utrudnia pobieranie / odczytywanie wartości w kolejności ich deklaracji.

Składnia

List_name = [value1,value2,value3.....valuen]

Ilustracja

Poniższy przykład pokazuje, jak używać List w Elm. Wypróbuj ten przykład w elm REPL -

> myList1 = [10,20,30]
[10,20,30] : List number
> myList2 = ["hello","world"]
["hello","world"] : List String

Jeśli spróbujemy dodać wartości różnych typów do listy, kompilator zgłosi błąd niezgodności typu. Jest to pokazane poniżej.

> 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

Operacje na listach

Poniższa tabela przedstawia typowe operacje na liście -

Sr. No metoda Opis
1 isEmpty: List a -> Bool sprawdza, czy lista jest pusta
2 rewers: List a -> Bool odwraca listę wejść
3 długość: Lista a -> Int zwraca rozmiar listy
4 maksimum: Lista porównywalna -> Może.Może być porównywalna zwraca maksymalną wartość
5 minimum: Lista porównywalna -> Może. Może porównywalna zwraca wartość minimalną
6 suma: Numer listy -> numer zwraca sumę wszystkich elementów na liście
7 produkt: Numer listy -> numer sprawdza, czy lista jest pusta
8 sort: Lista porównywalna -> Lista porównywalna sortuje listę w porządku rosnącym
9 concat: Lista (Lista a) -> Lista a scala kilka list w jedną
10 append: Lista a -> Lista a -> Lista a łączy dwie listy razem
11 zakres: Int -> Int -> List Int zwraca listę liczb od początku do końca
12 filter: (a -> Bool) -> Lista a -> Lista a filtruje listę wartości z listy wejściowej
13 head: Lista a -> Może. Może zwraca pierwszy element z listy
14 ogon:: Lista a -> Może. może (Lista a) zwraca wszystkie elementy oprócz głowy

jest pusty

Ta funkcja zwraca prawdę, jeśli lista jest pusta.

Składnia

List.isEmpty list_name

Aby sprawdzić podpis funkcji, wpisz w elm REPL -

> List.isEmpty
<function> : List a -> Bool

Ilustracja

> List.isEmpty
<function> : List a -> Bool

> List.isEmpty [10,20,30]
False : Bool

odwrócić

Ta funkcja odwraca listę.

Składnia

List.reverse list_name

Aby sprawdzić podpis funkcji, wpisz w elm REPL -

> List.reverse
<function> : List a -> List a

Ilustracja

> List.reverse [10,20,30]
[30,20,10] : List number

długość

Ta funkcja zwraca długość listy.

Składnia

List.length list_name

Aby sprawdzić podpis funkcji, wpisz w elm REPL -

> List.length
<function> : List a -> Int

Ilustracja

> List.length [10,20,30]
3 : Int

maksymalny

Ta funkcja zwraca maksymalny element z niepustej listy.

Składnia

List.maximum list_name

Aby sprawdzić podpis funkcji, wpisz w elm REPL -

> List.maximum
<function> : List comparable -> Maybe.Maybe comparable

Ilustracja

> List.maximum [10,20,30]
Just 30 : Maybe.Maybe number
> List.maximum []
Nothing : Maybe.Maybe comparable

minimum

Ta funkcja zwraca minimalny element z niepustej listy.

Składnia

List.minimum list_name

Aby sprawdzić podpis funkcji, wpisz w elm REPL -

> List.minimum
<function> : List comparable -> Maybe.Maybe comparable

Ilustracja

> List.minimum [10,20,30]
Just 10 : Maybe.Maybe number

suma

Ta funkcja zwraca sumę wszystkich elementów na liście.

Składnia

List.sum list_name

Aby sprawdzić podpis funkcji, wpisz w elm REPL -

> List.sum
<function> : List number -> number

Ilustracja

> List.sum [10,20,30]
60 : number

produkt

Ta funkcja zwraca iloczyn wszystkich elementów na liście.

Składnia

List.product list_name

Aby sprawdzić podpis funkcji, wpisz w elm REPL -

<function>  : List number ->  number

Ilustracja

List.product [10,20,30]
6000 : number

sortować

Ta funkcja sortuje wartości na liście od najniższej do najwyższej.

Składnia

List.sort list_name

Aby sprawdzić podpis funkcji, wpisz w elm REPL -

> List.sort
<function> : List comparable -> List comparable

Ilustracja

> List.sort [10,20,30]
[10,20,30] : List number

concat

Ta funkcja łączy kilka list w jedną listę.

Składnia

List.concat [ [list_name1],[list_name2],[list_name3],.....[list_nameN] ]

Aby sprawdzić podpis funkcji, wpisz w elm REPL -

> List.concat
<function> : List (List a) -> List a

Ilustracja

> List.concat [[10,20], [30,40],[50,60]]
[10,20,30,40,50,60] : List number

dodać

Ta funkcja łączy dwie listy.

Składnia

List.append [list_name1] [list_name2]

Aby sprawdzić podpis funkcji, wpisz w elm REPL -

> List.append
<function> : List a -> List a -> List a

Ilustracja

> List.append [10,20] [30,40]
[10,20,30,40] : List number

Operator ++ może być również użyty do dołączenia listy do innej. Pokazuje to poniższy przykład -

> [10.1,20.2] ++ [30.3,40.4]
[10.1,20.2,30.3,40.4] : List Float

zasięg

Ta funkcja tworzy listę liczb, przy czym każdy element rośnie o jeden. Najniższa i najwyższa liczba, która powinna znajdować się na liście, jest przekazywana do funkcji.

Składnia

List.range start_range end_range

Aby sprawdzić podpis funkcji, wpisz w elm REPL -

> List.range
<function> : Int -> Int -> List Int

Ilustracja

> List.range 1 10
[1,2,3,4,5,6,7,8,9,10] : List Int

filtr

Ta funkcja filtruje zestaw wartości z listy wejściowej. Zachowaj tylko wartości, które przejdą test.

Składnia

List.filter test_function input_list

Aby sprawdzić podpis funkcji, wpisz w elm REPL -

> List.filter
<function> : (a -> Bool) -> List a -> List a

Ilustracja

Poniższy przykład filtruje wszystkie liczby parzyste z listy wejściowej

> List.filter (\n -> n%2==0) [10,20,30,55]
[10,20,30] : List Int

głowa

Ta funkcja zwraca pierwszy element z listy wejściowej.

Składnia

List.head input_list

Aby sprawdzić podpis funkcji, wpisz w elm REPL -

> List.head
<function> : List a -> Maybe.Maybe a

Ilustracja

> List.head [10,20,30,40]
Just 10 : Maybe.Maybe number
> List.head []
Nothing : Maybe.Maybe a

ogon

Ta funkcja zwraca wszystkie elementy po pierwszym na liście.

Składnia

List.tail input_list

Aby sprawdzić podpis funkcji, wpisz w elm REPL -

> List.tail
<function> : List a -> Maybe.Maybe (List a)

Ilustracja

> 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)

Korzystanie z operatora Cons

Operator wad (::) dodaje element na początek listy.

Ilustracja

> 10::[20,30,40,50]
[10,20,30,40,50] : List number

Nowy element do dodania i typ danych wartości na liście muszą być zgodne. Kompilator zgłasza błąd, jeśli typy danych nie są zgodne.

> [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.

Listy są niezmienne

Sprawdźmy, czy listy są niezmienne w Elm. Pierwsza lista myList połączona z wartością 1 tworzy nową listę i jest zwracana do myListCopy . Dlatego jeśli wyświetlimy listę początkową, jej wartości nie ulegną zmianie.

> myList = [10,20,30]
[10,20,30] : List number
> myListCopy = 1::myList
[1,10,20,30] : List number
> myList
[10,20,30] : List number
>myList == myListCopy
False : Bool