En Elm, un Set representa un conjunto de valores únicos y ordenados, sin repeticiones y con operaciones típicas de teoría de conjuntos: unión, intersección, diferencia, etc.
Un Set se define como:
Set comparable
comparable: el tipo de los valores que puede contener (por ejemplo, Int, String, Char, etc.).
Todos los valores deben ser comparables, es decir, Elm debe poder ordenarlos.
Esto significa que no podés usar listas, records o funciones dentro de un Set.
Podés crearlo vacío o a partir de una lista:
import Set exposing (Set)
-- Conjunto vacío
numeros : Set Int
numeros = Set.empty
-- Desde una lista
pares : Set Int
pares = Set.fromList [2, 4, 6, 8, 10]
Los duplicados se eliminan automáticamente:
Set.fromList [1, 2, 2, 3]
-- Resultado: {1, 2, 3}
Set.member 4 pares
-- True
Set.member 5 pares
-- False
-- Agregar un elemento
paresActualizados =
Set.insert 12 pares
-- Eliminar un elemento
paresFiltrados =
Set.remove 8 paresActualizados
Recordá: todo es inmutable. Cada operación devuelve un nuevo Set, sin modificar el original.
Podés convertir un Set a lista:
Set.toList pares
-- [2,4,6,8,10]
Y viceversa:
Set.fromList [3,1,2]
-- {1,2,3}
Para aplicar transformaciones, primero lo convertís a lista y luego de vuelta:
paresDoblados =
Set.fromList (List.map (\x -> x * 2) (Set.toList pares))
Elm ofrece las funciones clásicas de teoría de conjuntos:
Set.union: Unión de dos conjuntos
Set.union (Set.fromList [1,2]) (Set.fromList [2,3]) --> {1,2,3}
Set.intersect: Intersección
Set.intersect (Set.fromList [1,2,3]) (Set.fromList [2,3,4]) --> {2,3}
Set.diff: Diferencia
Set.diff (Set.fromList [1,2,3]) (Set.fromList [2]) --> {1,3}
Set.isEmpty:¿Está vacío?
Set.isEmpty Set.empty --> True
Set.size: Cantidad de elementos
Set.size (Set.fromList [1,2,3]) --> 3
Gracias al sistema de tipos de Elm:
- No hay null ni valores inesperados.
- No podés mezclar tipos diferentes dentro del mismo Set.
- Todas las operaciones son puras e inmutables.
Por ejemplo:
-- Esto da error de compilación
Set.fromList [1, "dos", 3]