Elm - Lista
As estruturas de dados List, Tuplas e Record podem ser usadas para armazenar uma coleção de valores.
Este capítulo descreve como usar List no Elm.
Uma lista é uma coleção de valores homogêneos. Os valores em uma lista devem ser todos do mesmo tipo de dados.
Considere as seguintes limitações ao usar variáveis para armazenar valores -
As variáveis são escalares por natureza. Em outras palavras, no momento da declaração, uma variável pode conter apenas um valor. Isso significa que para armazenar n valores em um programa, serão necessárias n declarações de variáveis. Portanto, o uso de variáveis não é viável quando é necessário armazenar uma coleção maior de valores.
As variáveis em um programa são alocadas na memória em ordem aleatória, dificultando a recuperação / leitura dos valores na ordem de sua declaração.
Sintaxe
List_name = [value1,value2,value3.....valuen]
Ilustração
O exemplo a seguir mostra como usar uma lista no Elm. Experimente este exemplo em elm REPL -
> myList1 = [10,20,30]
[10,20,30] : List number
> myList2 = ["hello","world"]
["hello","world"] : List String
Se tentarmos adicionar valores de tipos diferentes em uma lista, o compilador lançará um erro de incompatibilidade de tipo. Isso é mostrado abaixo.
> 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
Operações de lista
A tabela a seguir mostra as operações comuns em uma lista -
Sr. Não | Método | Descrição |
---|---|---|
1 | isEmpty: Lista a -> Bool | verifica se a lista está vazia |
2 | reverso: Lista a -> Bool | inverte a lista de entrada |
3 | comprimento: Lista a -> Int | retorna o tamanho da lista |
4 | máximo: Lista comparável -> Talvez. Talvez comparável | retorna o valor máximo |
5 | mínimo: Lista comparável -> Talvez. Talvez comparável | retorna o valor mínimo |
6 | soma: Número da lista -> número | retorna a soma de todos os elementos da lista |
7 | produto: número da lista -> número | verifica se a lista está vazia |
8 | classificar: lista comparável -> lista comparável | classifica a lista em ordem crescente |
9 | concat: Lista (Lista a) -> Lista a | mescla várias listas em uma |
10 | anexar: Lista a -> Lista a -> Lista a | une duas listas |
11 | intervalo: Int -> Int -> List Int | retorna uma lista de números do início ao fim |
12 | filtro: (a -> Bool) -> Lista a -> Lista a | filtra a lista de valores da lista de entrada |
13 | head: List a -> Maybe.Talvez a | retorna o primeiro elemento da lista |
14 | tail:: List a -> Maybe.Maybe (List a) | retorna todos os elementos exceto o cabeçalho |
está vazia
Esta função retorna verdadeiro se uma lista estiver vazia.
Sintaxe
List.isEmpty list_name
Para verificar a assinatura da função, digite o seguinte em elm REPL -
> List.isEmpty
<function> : List a -> Bool
Ilustração
> List.isEmpty
<function> : List a -> Bool
> List.isEmpty [10,20,30]
False : Bool
reverter
Esta função inverte a lista.
Sintaxe
List.reverse list_name
Para verificar a assinatura da função, digite o seguinte em elm REPL -
> List.reverse
<function> : List a -> List a
Ilustração
> List.reverse [10,20,30]
[30,20,10] : List number
comprimento
Esta função retorna o comprimento de uma lista.
Sintaxe
List.length list_name
Para verificar a assinatura da função, digite o seguinte em elm REPL -
> List.length
<function> : List a -> Int
Ilustração
> List.length [10,20,30]
3 : Int
máximo
Esta função retorna o elemento máximo em uma lista não vazia.
Sintaxe
List.maximum list_name
Para verificar a assinatura da função, digite o seguinte em elm REPL -
> List.maximum
<function> : List comparable -> Maybe.Maybe comparable
Ilustração
> List.maximum [10,20,30]
Just 30 : Maybe.Maybe number
> List.maximum []
Nothing : Maybe.Maybe comparable
mínimo
Esta função retorna o elemento mínimo em uma lista não vazia.
Sintaxe
List.minimum list_name
Para verificar a assinatura da função, digite o seguinte em elm REPL -
> List.minimum
<function> : List comparable -> Maybe.Maybe comparable
Ilustração
> List.minimum [10,20,30]
Just 10 : Maybe.Maybe number
soma
Esta função retorna a soma de todos os elementos de uma lista.
Sintaxe
List.sum list_name
Para verificar a assinatura da função, digite o seguinte em elm REPL -
> List.sum
<function> : List number -> number
Ilustração
> List.sum [10,20,30]
60 : number
produtos
Esta função retorna o produto de todos os elementos em uma lista.
Sintaxe
List.product list_name
Para verificar a assinatura da função, digite o seguinte em elm REPL -
<function> : List number -> number
Ilustração
List.product [10,20,30]
6000 : number
ordenar
Esta função classifica os valores do menor para o maior em uma lista.
Sintaxe
List.sort list_name
Para verificar a assinatura da função, digite o seguinte em elm REPL -
> List.sort
<function> : List comparable -> List comparable
Ilustração
> List.sort [10,20,30]
[10,20,30] : List number
concat
Esta função concatena várias listas em uma única lista.
Sintaxe
List.concat [ [list_name1],[list_name2],[list_name3],.....[list_nameN] ]
Para verificar a assinatura da função, digite o seguinte em elm REPL -
> List.concat
<function> : List (List a) -> List a
Ilustração
> List.concat [[10,20], [30,40],[50,60]]
[10,20,30,40,50,60] : List number
acrescentar
Esta função reúne duas listas.
Sintaxe
List.append [list_name1] [list_name2]
Para verificar a assinatura da função, digite o seguinte em elm REPL -
> List.append
<function> : List a -> List a -> List a
Ilustração
> List.append [10,20] [30,40]
[10,20,30,40] : List number
O operador ++ também pode ser usado para anexar uma lista a outra. Isso é mostrado no exemplo abaixo -
> [10.1,20.2] ++ [30.3,40.4]
[10.1,20.2,30.3,40.4] : List Float
alcance
Esta função cria uma lista de números, cada elemento aumentando em um. O menor e o maior número que deveriam estar na lista são passados para a função.
Sintaxe
List.range start_range end_range
Para verificar a assinatura da função, digite o seguinte em elm REPL -
> List.range
<function> : Int -> Int -> List Int
Ilustração
> List.range 1 10
[1,2,3,4,5,6,7,8,9,10] : List Int
filtro
Esta função filtra um conjunto de valores da lista de entrada. Mantenha apenas os valores que passam no teste.
Sintaxe
List.filter test_function input_list
Para verificar a assinatura da função, digite o seguinte em elm REPL -
> List.filter
<function> : (a -> Bool) -> List a -> List a
Ilustração
O exemplo a seguir filtra todos os números pares de uma lista de entrada
> List.filter (\n -> n%2==0) [10,20,30,55]
[10,20,30] : List Int
cabeça
Esta função retorna o primeiro elemento da lista de entrada.
Sintaxe
List.head input_list
Para verificar a assinatura da função, digite o seguinte em elm REPL -
> List.head
<function> : List a -> Maybe.Maybe a
Ilustração
> List.head [10,20,30,40]
Just 10 : Maybe.Maybe number
> List.head []
Nothing : Maybe.Maybe a
rabo
Esta função retorna todos os elementos após o primeiro na lista.
Sintaxe
List.tail input_list
Para verificar a assinatura da função, digite o seguinte em elm REPL -
> List.tail
<function> : List a -> Maybe.Maybe (List a)
Ilustração
> 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)
Usando o Operador Contras
O operador contras (::) adiciona um elemento ao início de uma lista.
Ilustração
> 10::[20,30,40,50]
[10,20,30,40,50] : List number
O novo elemento a ser adicionado e o tipo de dados dos valores na lista devem corresponder. O compilador lança um erro se os tipos de dados não corresponderem.
> [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.
Listas são imutáveis
Vamos verificar se as listas são imutáveis no Elm. A primeira lista myList, quando concatenada com o valor 1, cria uma nova lista e é retornada para myListCopy . Portanto, se exibirmos a lista inicial, seus valores não serão alterados.
> 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