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