Olmo - Lista
Las estructuras de datos List, Tuples y Record se pueden utilizar para almacenar una colección de valores.
Este capítulo trata sobre cómo usar List en Elm.
Una lista es una colección de valores homogéneos. Todos los valores de una lista deben ser del mismo tipo de datos.
Tenga en cuenta las siguientes limitaciones al utilizar variables para almacenar valores:
Las variables son de naturaleza escalar. En otras palabras, en el momento de la declaración, una variable solo puede contener un valor. Esto significa que para almacenar n valores en un programa, se necesitarán n declaraciones de variables. Por tanto, el uso de variables no es factible cuando se necesita almacenar una colección mayor de valores.
A las variables de un programa se les asigna memoria en orden aleatorio, lo que dificulta la recuperación / lectura de los valores en el orden de su declaración.
Sintaxis
List_name = [value1,value2,value3.....valuen]
Ilustración
El siguiente ejemplo muestra cómo usar una lista en Elm. Pruebe este ejemplo en elm REPL -
> myList1 = [10,20,30]
[10,20,30] : List number
> myList2 = ["hello","world"]
["hello","world"] : List String
Si intentamos agregar valores de diferentes tipos en una lista, el compilador arrojará un error de falta de coincidencia de tipos. Esto se muestra a continuación.
> 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
Operaciones de lista
La siguiente tabla muestra las operaciones comunes en una lista:
No Señor | Método | Descripción |
---|---|---|
1 | isEmpty: Lista a -> Bool | comprueba si la lista está vacía |
2 | reverso: Lista a -> Bool | invierte la lista de entrada |
3 | longitud: Lista a -> Int | devuelve el tamaño de la lista |
4 | máximo: Lista comparable -> Quizás. Quizás comparable | devuelve el valor máximo |
5 | mínimo: Lista comparable -> Quizás. Quizás comparable | devuelve el valor mínimo |
6 | suma: Número de lista -> número | devuelve la suma de todos los elementos en la lista |
7 | producto: Número de lista -> número | comprueba si la lista está vacía |
8 | sort: Lista comparable -> Lista comparable | ordena la lista en orden ascendente |
9 | concat: Lista (Lista a) -> Lista a | fusiona un montón de listas en una |
10 | añadir: Lista a -> Lista a -> Lista a | fusiona dos listas juntas |
11 | rango: Int -> Int -> List Int | devuelve una lista de números de principio a fin |
12 | filtro: (a -> Bool) -> Lista a -> Lista a | filtra la lista de valores de la lista de entrada |
13 | cabeza: Lista a -> Quizás. | devuelve el primer elemento de la lista |
14 | tail:: Lista a -> Quizás. Quizás (Lista a) | devuelve todos los elementos excepto el encabezado |
esta vacio
Esta función devuelve verdadero si una lista está vacía.
Sintaxis
List.isEmpty list_name
Para verificar la firma de la función, escriba lo siguiente en elm REPL:
> List.isEmpty
<function> : List a -> Bool
Ilustración
> List.isEmpty
<function> : List a -> Bool
> List.isEmpty [10,20,30]
False : Bool
contrarrestar
Esta función invierte la lista.
Sintaxis
List.reverse list_name
Para verificar la firma de la función, escriba lo siguiente en elm REPL:
> List.reverse
<function> : List a -> List a
Ilustración
> List.reverse [10,20,30]
[30,20,10] : List number
longitud
Esta función devuelve la longitud de una lista.
Sintaxis
List.length list_name
Para verificar la firma de la función, escriba lo siguiente en elm REPL:
> List.length
<function> : List a -> Int
Ilustración
> List.length [10,20,30]
3 : Int
máximo
Esta función devuelve el elemento máximo en una lista no vacía.
Sintaxis
List.maximum list_name
Para verificar la firma de la función, escriba lo siguiente en elm REPL:
> List.maximum
<function> : List comparable -> Maybe.Maybe comparable
Ilustración
> List.maximum [10,20,30]
Just 30 : Maybe.Maybe number
> List.maximum []
Nothing : Maybe.Maybe comparable
mínimo
Esta función devuelve el elemento mínimo en una lista no vacía.
Sintaxis
List.minimum list_name
Para verificar la firma de la función, escriba lo siguiente en elm REPL:
> List.minimum
<function> : List comparable -> Maybe.Maybe comparable
Ilustración
> List.minimum [10,20,30]
Just 10 : Maybe.Maybe number
suma
Esta función devuelve la suma de todos los elementos de una lista.
Sintaxis
List.sum list_name
Para verificar la firma de la función, escriba lo siguiente en elm REPL:
> List.sum
<function> : List number -> number
Ilustración
> List.sum [10,20,30]
60 : number
producto
Esta función devuelve el producto de todos los elementos de una lista.
Sintaxis
List.product list_name
Para verificar la firma de la función, escriba lo siguiente en elm REPL:
<function> : List number -> number
Ilustración
List.product [10,20,30]
6000 : number
ordenar
Esta función ordena los valores de menor a mayor en una lista.
Sintaxis
List.sort list_name
Para verificar la firma de la función, escriba lo siguiente en elm REPL:
> List.sort
<function> : List comparable -> List comparable
Ilustración
> List.sort [10,20,30]
[10,20,30] : List number
concat
Esta función concatena un montón de listas en una sola lista.
Sintaxis
List.concat [ [list_name1],[list_name2],[list_name3],.....[list_nameN] ]
Para verificar la firma de la función, escriba lo siguiente en elm REPL:
> List.concat
<function> : List (List a) -> List a
Ilustración
> List.concat [[10,20], [30,40],[50,60]]
[10,20,30,40,50,60] : List number
adjuntar
Esta función junta dos listas.
Sintaxis
List.append [list_name1] [list_name2]
Para verificar la firma de la función, escriba lo siguiente en elm REPL:
> List.append
<function> : List a -> List a -> List a
Ilustración
> List.append [10,20] [30,40]
[10,20,30,40] : List number
El operador ++ también se puede utilizar para agregar una lista a otra. Esto se muestra en el siguiente ejemplo:
> [10.1,20.2] ++ [30.3,40.4]
[10.1,20.2,30.3,40.4] : List Float
rango
Esta función crea una lista de números, cada elemento se incrementa en uno. El número más bajo y más alto que debería estar en la lista se pasa a la función.
Sintaxis
List.range start_range end_range
Para verificar la firma de la función, escriba lo siguiente en elm REPL:
> List.range
<function> : Int -> Int -> List Int
Ilustración
> List.range 1 10
[1,2,3,4,5,6,7,8,9,10] : List Int
filtrar
Esta función filtra un conjunto de valores de la lista de entrada. Conserve solo los valores que pasen la prueba.
Sintaxis
List.filter test_function input_list
Para verificar la firma de la función, escriba lo siguiente en elm REPL:
> List.filter
<function> : (a -> Bool) -> List a -> List a
Ilustración
El siguiente ejemplo filtra todos los números pares de una lista de entrada
> List.filter (\n -> n%2==0) [10,20,30,55]
[10,20,30] : List Int
cabeza
Esta función devuelve el primer elemento de la lista de entrada.
Sintaxis
List.head input_list
Para verificar la firma de la función, escriba lo siguiente en elm REPL:
> List.head
<function> : List a -> Maybe.Maybe a
Ilustración
> List.head [10,20,30,40]
Just 10 : Maybe.Maybe number
> List.head []
Nothing : Maybe.Maybe a
cola
Esta función devuelve todos los elementos después del primero en la lista.
Sintaxis
List.tail input_list
Para verificar la firma de la función, escriba lo siguiente en elm REPL:
> List.tail
<function> : List a -> Maybe.Maybe (List a)
Ilustración
> 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)
Uso del operador Contras
El operador cons (::) agrega un elemento al principio de una lista.
Ilustración
> 10::[20,30,40,50]
[10,20,30,40,50] : List number
El nuevo elemento que se agregará y el tipo de datos de los valores en la lista deben coincidir. El compilador arroja un error si los tipos de datos no coinciden.
> [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.
Las listas son inmutables
Comprobemos si las listas son inmutables en Elm. La primera lista myList cuando se concatena con el valor 1 crea una nueva lista y se devuelve a myListCopy . Por lo tanto, si mostramos la lista inicial, sus valores no cambiarán.
> 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