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