Want to create interactive content? It’s easy in Genially!
Get started free
Copia - 2.1.3 Intervalos
TECNOLOGICO NACIONAL DE MÉXICO
Created on September 10, 2025
Start designing with a free template
Discover more than 1500 professional designs like these:
Transcript
2025
Intervalos Programación Lógica y Funcional
Introducción
- Es importante recordar que en los lenguajes funcionales, las funciones devuelven siempre el mismo valor.
- Los lenguajes funcionales puros tienen la propiedad de transparencia referencial, como consecuencia, en programación funcional, una función siempre devuelve el mismo valor cuando se le llama con los mismos parámetros
- Las funciones no modifican ningún estado, no acceden a ninguna variable ni objeto global y no modifican su valor.
- En programación funcional pura una vez declarada una variable no se puede modificar su valor.
- En algunos lenguajes de programación (como Scala) este concepto se refuerza definiendo la variable como inmutable (con la directiva val).
- En cambio, en programación imperativa es habitual modificar el valor de una variable en distintos pasos de ejecución.
Intervalos
- Las funciones en Haskell se definen en dos partes.:
- La primera identifica el nombre, el dominio y el intervalo de la función.
- La segunda describe el significado de la función.
Listas
- Una lista es una colección ordenada de valores. Todos los elementos de una lista deben ser del mismo tipo (inclusive pueden existir listas de listas).
- Las listas son la estructura de datos básica en Haskell (y en la mayoría de lenguajes funcionales).
- No solo sirven para almacenar datos, sino que son un elemento fundamental en el diseño de algoritmos.
- Una lista es un par (x : xs) donde x es el primer elemento de la lista y xs la (sub)lista que contiene el resto de los elementos.
- La lista vacía se simboliza [].
- La lista formada por los enteros 1 al 5 sería: [1, 2, 3, 4, 5] ó [1..5] ó [1, 2, ..5].
- En Haskell la sublista puede estar indicada por una expresión y por el mecanismo de evaluación diferida esto posibilita el poder definir (y usar) listas infinitas.
- Las listas se almacenan internamente en un formato no evaluado.
Funciones predefinidas con listas
- Acceso a primer (head) y último (last) elemento, lista sin primer elemento (tail) y sin último elemento (init):
- Longitud (length), elementoi-ésimo(!!), concatenar (++):
- Sublistas: Obtener primeros n elementos (take), quitar primeros n elementos, obtener y quitar mientras se cumpla una condición:
Ejemplos
Listas Enumeradas
- Todo tipo de datos que pertenezca a la clase Enum tiene definidas funciones (enumFrom, etc.) para generar rangos de valores. Existe una sintaxis especial para crear listas basadas en esos rangos:
- [1..10] --> [1,2,3,4,5,6,7,8,9,10]
- ['a'..'z'] --> "abcdefghijklmnopqrstuvwxyz"
- [1,3..10] --> [1,3,5,7,9]
- [1..] --> [1,2,3,...] Lista infinita!
Es posible crear listas infinitas porque Haskell tiene evaluación diferida. Si una operación sólo trabaja sobre una parte de la lista, no existe ningún problema: Otras funciones: Zip, ZipWith combinan dos listas en una sola (lista depares o lista basada en operaciones sobre los pares).
Map, Filter, Folder
- Existe un grupo de funciones sobre listas (tipicamente se denomina map-filter-reduce) que se han mostrado extremadamente útiles en la resolución de gran cantidad de problemas:
- Map aplica una misma operación (unaria) sobre todos los elementos de una lista, devolviendo la lista modificada.
- Filter crea otra lista extrayendo sólo los elementos que cumplan una condición.
- Folder (Reduce) "colapsa" una lista aplicando una operación binaria que consume un elemento más y el resultado del colapso actual.
1. Map
- Recibe una función que transforma valores de tipo a en valores de tipo b y una lista de a's, y devuelve una lista de b's: La lista original aplicando la función a todos los valores.
- Ejemplos (show es la función que traduce un valor a cadena):
Ejemplos
- Si intentamos aplicar map directamente a una matriz (una lista de listas) obtenemos un error:
- El problema es que los elementos de la lista son a su vez listas, y no tiene sentido el sumar 1 a una lista.
- Lo que si podemos aplicar a cada elemento (lista) es la operación de aplicar (map) el incremento:
2. Filter
- Recibe un predicado y una lista de valores y devuelve la lista a la que sólo pertenecen los valores que cumplan el predicado:
- Ejemplo: lista infinita de primos. (usando la función esPrimo1):
Ejemplos
- Función que devuelve el número de veces que se encuentra un elemento en una lista:
- Lista de primos menores que lim.: usando el método de la Criba de Eratóstenes (filtrar múltiplos de primos):
3. Folder
- Folder colapsa una lista de a's en un único valor de tipo b (que tipicamente suele ser a). Para ello va consumiendo elementos de la lista y les aplica un operador binario junto con un valor acumulado, que al final será el resultado.
- Existen variantes que depende de como se consuman los elementos (izda dcha o al revés) y si se da un valor inicial o no.
- Puede ser util visualizarlo como la sustitución del operador constructor de listas, : , por el operador (lo denotamos como ) indicado.
Ejemplos
- Suma de los elementos de una lista:
- Comprobar si un elemento pertenece a una lista:
- Invertir una lista:
¡GRACIAS!
2025
