Tema 29: Las librerías de conjuntos y diccionarios en Haskell
Índice
1. Introducción de los conjuntos
- Los conjuntos permiten almacenar elementos en los que no importa el orden ni las repeticiones.
- En esta tema se presentan ejemplos de las funciones de la librería de conjuntos Data.Set 0.6.5.1
En los ejemplos se supone que se ha importado la siguiente librería
λ> import Data.Set as S
Debido a que
Data.Setexporta funciones que colisionan con las dePreludeyData.List, se suele importar de forma cualificada.import qualified Data.Set as S
2. El tipo de los conjuntos
(Set a)es el tipo de los conjuntos con elementos de tipo a. Por ejemplo,λ> c1 = fromList [3,2,5,3] λ> :type c1 c1 :: (Ord a, Num a) => Set a λ> c1 fromList [2,3,5] λ> c2 = fromList [2,5,2,3] λ> c1 == c2 True
3. Funciones sobre conjuntos
3.1. Funciones básicas
emptyes el conjunto vacío. Por ejemplo,λ> empty fromList []
(insert x c)es el conjunto obtenido insertando el elementoxen el conjuntoc. Por ejemplo,λ> insert 7 (fromList [3,2,5]) fromList [2,3,5,7] λ> insert 2 (fromList [3,2,5]) fromList [2,3,5]
(delete x c)es el conjunto obtenido eliminando el elementoxdel conjuntoc. Por ejemplo,λ> delete 3 (fromList [3,2,5,3,4]) fromList [2,4,5] λ> delete 7 (fromList [3,2,5,3,4]) fromList [2,3,4,5]
(member x c)se verifica sixes un elemento del conjuntoc. Por ejemplo,λ> member 5 (fromList [3,2,5]) True λ> member 7 (fromList [3,2,5]) False
(null c)se verifica sices el conjunto vacío. Por ejemplo,λ> S.null (fromList []) True λ> S.null (fromList [5,2]) False
3.2. Complejidades
Comparación de las complejidades de las operaciones de los conjuntos definidas en el Tema 17 con las de la librería de conjuntos
Data.Set.TAD LNOCD LNOSD LOSD Data.Set vacio O(1) O(1) O(1) empty O(1) inserta O(1) O(n) O(n) insert O(log(n)) elimina O(n) O(n) O(n) delete O(log(n)) pertenece O(n) O(n) O(n) member O(log(n)) esVacio O(1) O(1) O(1) null O(1) donde las representaciones de conjuntos son
- LNOCD: listas no ordenadas con duplicados
- LNOSD: listas no ordenadas sin duplicados
- LOSD: listas ordenadas sin duplicados
3.3. De listas a conjuntos y viceversa
(fromList xs)es el conjunto cuyos elementos son los de la listaxs. Por ejemplo,λ> fromList [3,2,5,2,15] fromList [2,3,5,15] λ> :t it it :: (Ord a, Num a) => Set a
(toList c)es la lista de los elementos del conjuntocordenados crecientemente. Por ejemplo,λ> toList (fromList [3,2,5,2,1,5]) [1,2,3,5]
(elems c)es la lista de los elementos del conjuntocordenados crecientemente. Por ejemplo,λ> elems (fromList [3,2,5,2,1,5]) [1,2,3,5]
3.4. Operaciones y relaciones usuales
(union cs c2)es la unión de los conjuntosc1yc2. Por ejemplo,λ> union (fromList [3,2,5]) (fromList [2,7,5]) fromList [2,3,5,7]
(intersection cs c2)es la intersecciṕn de los conjuntosc1yc2. Por ejemplo,λ> intersection (fromList [3,2,5]) (fromList [2,7,5]) fromList [2,5]
(difference c1 c2)es la diferencia de los conjuntosc1yc2. Por ejemplo,λ> difference (fromList [2,5,3]) (fromList [1,4,5]) fromList [2,3]
(c1 \\ c2)es la diferencia de los conjuntosc1yc2. Por ejemplo,λ> fromList [2,5,3] \\ fromList [1,4,5] fromList [2,3]
(size c)es el número de elementos del conjuntoc. Por ejemplo,λ> size (fromList [3,2,5,3,2,1]) 4
(isSubsetOf c1 c2)se verifica sic1es un subconjunto dec2. Por ejemplo,λ> isSubsetOf (fromList [3,5]) (fromList [3,2,5]) True λ> isSubsetOf (fromList [3,5,2]) (fromList [3,2,5]) True λ> isProperSubsetOf (fromList [3,7]) (fromList [3,2,5]) False
(isProperSubsetOf c1 c2)se verifica sic1es un subconjunto propio dec2. Por ejemplo,λ> isProperSubsetOf (fromList [3,5]) (fromList [3,2,5]) True λ> isProperSubsetOf (fromList [3,5,2]) (fromList [3,2,5]) False λ> isProperSubsetOf (fromList [3,7]) (fromList [3,2,5]) False
(c1 == c2)se verifica si los conjuntosc1yc2son iguales. Por ejemplo,λ> fromList [3,2,5] == fromList [5,2,3,2] True λ> fromList [3,2,5] == fromList [5,1,3,2] False
(map f c)es el conjunto obtenido aplicando a cada elemento decla funciónf. Por ejemplo,λ> S.map (+2) (fromList [3,2,7]) fromList [4,5,9]
(filter p c)es el conjunto de los elementos decque cumplenp. Por ejemplo,λ> S.filter even (fromList [3,2,5,7,8,6,9]) fromList [2,6,8]
3.5. Más funciones sobre conjuntos
- En Manual de la librería de conjuntos Data.Set se describen las funciones de la librería mediante ejemplos.
- En Data.Set se describen las funciones de la librería junto con sus órdenes de complejidad.
4. Introducción de los diccionarios
- Los diccionarios (también llamados listas de asociación) son listas utilizadas para almacenar pares clave-valor donde el orden no importa.
- Por ejemplo, podemos tener un diccionario para almacenar números de teléfono, donde los números de telefono serían los valores y los nombres de la gente serían las claves.
- No nos importa el orden en el que estén almacenados, sólo queremos obtener el número correspondiente cada persona.
- En este manual se presentan ejemplos de las funciones de la librería de diccionarios Data.Map 0.5.5.1.
En los ejemplos se supone que se ha importado la siguiente librería
λ> import Data.Map as M
Debido a que
Data.Mapexporta funciones que colisionan con las dePreludeyData.List, se suele importar de forma cualificada.import qualified Data.Map as Map
5. El tipo de los diccionarios
(Map c a)es el tipo de los diccionarios con las claves de tipocy los valores de tipoa. Por ejemplo,λ> let d1 = fromList [("Ana",5),("Juan",7),("Eva",6)] λ> :t d1 d1 :: Map [Char] Integer λ> let d2 = fromList [("Ana",5),("Eva",6),("Juan",7)] λ> d1 == d2 True
6. Funciones sobre diccionarios
6.1. Funciones básicas
emptyes el diccionario vacío. Por ejemplo,λ> empty fromList []
(insert k x d)es el diccionario obtenido añadiéndole adel par(k,x)y eliminando el valor dekenden el caso de que existiera. Por ejemplo,λ> insert 3 7 empty fromList [(3,7)] λ> insert 3 'c' (fromList [(4,'a'),(6,'b'),(8,'e')]) fromList [(3,'c'),(4,'a'),(6,'b'),(8,'e')] λ> insert 6 'c' (fromList [(4,'a'),(6,'b'),(8,'e')]) fromList [(4,'a'),(6,'c'),(8,'e')]
(delete k d)es el diccionario obtenido eliminando endla claveky su valor. Por ejemplo,λ> delete 3 (fromList [(5,"a"),(3,"b"),(7,"d")]) fromList [(5,"a"),(7,"d")] λ> delete 4 (fromList [(5,"a"),(3,"b"),(7,"d")]) fromList [(3,"b"),(5,"a"),(7,"d")]
(member x d)se verifica sixes una clave del diccionariod. Por ejemplo,λ> member 5 (fromList [(4,'a'),(5,'b'),(2,'e')]) True λ> member 7 (fromList [(4,'a'),(5,'b'),(2,'e')]) False
#+end_src
null dse verifica si el diccionariodes vacío. Por ejemplo,λ> M.null (fromList []) True λ> M.null (fromList [(3,2)]) False
6.2. De listas a diccionarios y viceversa
(fromList ps)es el diccionario cuyos elementos es la lista de paresps. Si la lista tiene más de un valor para una clave, sólo se conserva el último. Por ejemplo,λ> fromList [(5,"a"),(3,"b"),(5,"c")] fromList [(3,"b"),(5,"c")] λ> fromList [(5,"a"),(3,"b"),(5,"c"),(3,"a")] fromList [(3,"a"),(5,"c")]
(toList d)es la lista ordenada de los elementos del diccionariod. Por ejemplo,λ> toList (fromList [(1,7),(3,5),(2,8)]) [(1,7),(2,8),(3,5)]
(keys d)es a lista ordenada de las claves del diccionariod. Por ejemplo,λ> keys (fromList [(1,7),(3,5),(2,8)]) [1,2,3]
(elems d)es a lista de los valores del diccionariodordenados según sus claves. Por ejemplo,λ> elems (fromList [(1,7),(3,5),(2,8)]) [7,8,5]
6.3. Operaciones y relaciones usuales
(size d)es el número de elementos del diccionariod. Por ejemplo,λ> size empty 0 λ> size (fromList [(4,'a'),(5,'b'),(2,'e')]) 3 λ> size (fromList [(4,'a'),(5,'b'),(2,'e'),(4,'a')]) 3 λ> size (fromList [(4,'a'),(5,'b'),(2,'e'),(4,'c')]) 3
(singleton k x)es el diccionario cuya única clave esku su valor esx. Por ejemplo,λ> singleton 'd' 4 fromList [('d',4)](lookup x d)es justo el valor del elemento del diccionariodcuya clave esx, si hay alguno yNothing, en caso contrario. Por ejemplo,λ> M.lookup 5 (fromList [(4,'a'),(5,'b'),(2,'e')]) Just 'b' λ> M.lookup 7 (fromList [(4,'a'),(5,'b'),(2,'e')]) Nothing
(map f d)aplicafa todos los valores ded. Por ejemplo,λ> M.map (+1) (fromList [(8,4),(3,8),(7,3),(6,7)]) fromList [(3,9),(6,8),(7,4),(8,5)]
(filter p d)es el diccionario formado por los elementos dedcuyo valor cumple el predicadop. Por ejemplo,λ> M.filter (>5) (fromList [("b",4),("e",8),("d",3),("a",7)]) fromList [("a",7),("e",8)](fromListWith f ps)es el diccionario cuyos elementos es la lista de parespscombinados con la operaciónf. Por ejemplo,λ> fromListWith (++) [(5,"a"),(3,"b"),(5,"c")] fromList [(3,"b"),(5,"ca")] λ> fromListWith (++) [(5,"a"),(3,"b"),(5,"c"),(3,"a")] fromList [(3,"ab"),(5,"ca")] λ> fromListWith (-) [(5,4),(3,6),(5,2),(3,1)] fromList [(3,-5),(5,-2)]
(insertWith f k x d)es el diccionario obtenido añadiéndole adel par(k,x)sikno es una clave dedo el par(k,f x y)si el par(k,y)pertenece ad. Por ejemplo,λ> insertWith (++) 7 "d" (fromList [(5,"a"), (3,"b")]) fromList [(3,"b"),(5,"a"),(7,"d")] λ> insertWith (++) 3 "d" (fromList [(5,"a"), (3,"b")]) fromList [(3,"db"),(5,"a")] λ> insertWith (*) 3 2 (fromList [(5,6), (3,4)]) fromList [(3,8),(5,6)] λ> insertWith (*) 3 2 empty fromList [(3,2)]
6.4. Más funciones sobre diccionarios
- En Manual de la librería de diccionarios Data.Map se describen las funciones de la librería mediante ejemplos.
- En Data.Map.Lazy se describen las funciones de la librería junto con sus órdenes de complejidad.
7. Referencia
- M. Lipovača ¡Aprende Haskell por el bien de todos!: