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