Want to create interactive content? It’s easy in Genially!
Unidad 2. Modelo de programación funcion
Dulce Valeria González Sánchez
Created on July 7, 2023
Unidad 2 de Programación Lógica y Funcional
Start designing with a free template
Discover more than 1500 professional designs like these:
Transcript
Unidad 2
Modelo de Programación Funcional
Materia: Programación Lógica Y Funcional Alumno(a): Dulce Valeria González Sánchez | 20650189 Prof.: Jhacer Kharen Ruíz Garduño ISC 7M
Empezar
2- El tipo de datos
1- Introducción al modelo de programación
3- Funciones
4- Intervalos
ÍNDICE
8- Evaluación perezosa
7- Árboles
6- Aplicaciones de las listas
5- Operadores
01
Introducción al modelo de programación funcional
Introducción al modelo de programación funcional
El modelo de programación funcional es un paradigma de programación que se basa en la evaluación de expresiones matemáticas mediante la aplicación de funciones. En este modelo, el énfasis se coloca en la evaluación de las funciones y en evitar el cambio de estado y la mutación de datos.
Dentro de los lenguajes funcionales tenemos Lisp, Scheme, Clojure, Haskell, OCaml y Standard ML, entre otros. Estos lenguajes están diversidad de tipificación, donde se encuentran lenguajes dinámicos, estáticos y estáticos fuertes
02
El tipo de datos
Teoría de tipos
La teoría de tipos es un campo de estudio en la ciencia de la computación que se ocupa de clasificar y analizar los diferentes tipos de datos utilizados en la programación. Su objetivo es garantizar la corrección y seguridad de los programas al detectar errores de tipo antes de su ejecución. En la teoría de tipos, se asigna un tipo a cada expresión y se establecen reglas para determinar la compatibilidad y coherencia de los tipos en las operaciones y asignaciones. Esto permite verificar si un programa cumple con las restricciones de tipos y si los valores utilizados en las operaciones son adecuados.
El tipo de datos
El tipo de datos básicos
Lógicos
Texto
Numéricos
En un sentido amplio, un tipo de datos define un conjunto de valores y las operaciones sobre estos valores. Casi todos los lenguajes de programación explícitamente incluyen la notación del tipo de datos, aunque lenguajes diferentes pueden usar terminologías diferentes. La mayor parte de los lenguajes de programación permiten al programador definir tipos de datos adicionalesn, normalmente combinando múltiples elementos de otros tipos y definiendo las operaciones del nuevo tipo de dato.
Ejemplo
En Haskell, se pueden definir tipos de datos personalizados utilizando la palabra clave data. Estos tipos de datos pueden tener uno o varios constructores, que especifican cómo se pueden crear los valores del tipo. Por ejemplo, un programador puede crear un nuevo tipo de dato llamado "Persona" que específica que el dato interpretado como Persona incluirá, por ejemplo, un nombre, edad, altura, etc.
data Persona = Persona { nombre :: String, edad :: Int, altura :: Float }
Se pueden crear valores del tipo Persona utilizando los campos definidos:
juan :: Persona juan = Persona { nombre = "Juan", edad = 30, altura = 1.75 } 0 maria :: Persona maria = Persona { nombre = "Maria", edad = 25, altura = 1.60 }
03
Funciones
Funciones
Existen dos grandes categorías de lenguajes funcionales
Funcionales híbridos
Funcionales puros
Ejemplo
A continuación, se muestra un ejemplo de función en Haskell
sumaNumeros :: Int -> Int -> Int sumaNumeros x y = x + y
- sumaNumeros es el nombre de la función.
- Int -> Int -> Int especifica los tipos de los parámetros y el tipo de retorno de la función. En este caso, la función toma dos enteros (Int) como parámetros y devuelve un entero (Int).
- x e y son los nombres de los parámetros de la función. Estos parámetros representan los dos números que se sumarán.
- x + y es la expresión que se evalúa para obtener el resultado de la función. En este caso, simplemente se suman los valores de x e y.
04
Intervalos
Intervalos
En la programación funcional, los intervalos se pueden utilizar para representar un conjunto de valores continuos. Los intervalos se definen por un valor mínimo y un valor máximo, y se pueden realizar operaciones como unión, intersección y diferencia entre ellos. Por ejemplo, en Haskell, se puede definir un tipo de dato para representar intervalos de números enteros:
data Intervalo = Intervalo { minimo :: Int, maximo :: Int }
05
Operadores
Operadores
Los operadores en la programación funcional se utilizan para realizar operaciones en los datos. A diferencia de los lenguajes imperativos, en los que los operadores a menudo mutan los valores, en la programación funcional los operadores suelen crear nuevos valores en lugar de modificar los existentes. Por ejemplo, en Haskell, se pueden utilizar operadores como +, -, * y / para realizar operaciones aritméticas entre números.
Ejemplos de operadores en Haskell
06
Aplicaciones de las listas
Aplicaciones de las listas
Las listas se componen de elementos del mismo tipo y se pueden construir de forma recursiva. Las listas pueden ser utilizadas para representar secuencias de valores y se proporcionan diversas operaciones para manipularlas, como la adición de elementos al principio, la eliminación de elementos, la concatenación de listas, entre otras. Por ejemplo, en Haskell, se pueden crear listas de números enteros de la siguiente manera:
miLista :: [Int] miLista = [1, 2, 3, 4, 5]
07
Árboles
Árboles
Los árboles son estructuras de datos no lineales que se utilizan ampliamente en la programación funcional. Los árboles se componen de nodos que pueden tener cero o más hijos. Los árboles se utilizan para representar una amplia variedad de problemas, como estructuras de datos balanceadas, árboles de búsqueda binaria, árboles de expresiones, entre otros. Por ejemplo, en Haskell, se puede definir un tipo de dato para representar un árbol binario:
data Arbol a = Vacio | Nodo a (Arbol a) (Arbol a)
08
Evaluación perezosa
Evaluación perezosa
Es una estrategia utilizada en algunos lenguajes de programación funcionales en la que las expresiones no se evalúan hasta que se necesiten. Esto significa que las expresiones solo se evalúan cuando se utilizan en algún cálculo o cuando se necesita su valor. La evaluación perezosa puede permitir la evaluación de estructuras de datos infinitas y puede mejorar la eficiencia en ciertos casos al evitar la evaluación innecesaria. Por ejemplo, en Haskell, se puede definir una lista infinita utilizando evaluación perezosa:
naturales :: [Int] naturales = [0..]
Conclusión:
El modelo de programación funcional, con su enfoque en funciones puras, inmutabilidad y evaluación perezosa, ofrece una forma poderosa y flexible de desarrollar software. Promueve la claridad, la modularidad y el manejo seguro de datos, lo que puede conducir a programas más concisos y eficientes. Además, proporciona herramientas para trabajar con estructuras de datos infinitas y facilita la programación concurrente y paralela. En general, el modelo funcional ofrece una alternativa valiosa en el desarrollo de software y amplía las habilidades de los programadores.
¡Gracias por su Atención!
Fuentes bibliograficas
TEMA 2 Programacion Funcional - PROGRAMACIÓN LÓGICA FUNCIONAL Docente: Ing. Javier Arley González. (s/f). Studocu. Recuperado el 7 de julio de 2023, de https://www.studocu.com/es-mx/document/universidad-tecnologica-de-tabasco/programacion-logica-y-funcional/tema-2-programacion-funcional/28929167 Velasco, R. (2018, mayo 22). 2.- Modelo de Programación Funcional. Blogspot.com. http://prologvelascorus.blogspot.com/2018/05/2-modelo-de-programacion-funcional.html
Árboles
Un árbol es un tipo abstracto de datos ampliamente usado que imita la estructura jerárquica de un árbol, con un valor en la raíz y subárboles con un nodo padre, representado como un conjunto de nodos enlazados.
Funcionales hibridos
Combinan características y conceptos de la programación funcional con otros paradigmas de programación, como la programación imperativa o la programación orientada a objetos. Estos tienen las siguientes características:
- Paradigma multi-paradigma. Permiten la combinación de diferentes paradigmas de programación en un solo lenguaje.
- Funciones como ciudadanos de primera clase. Al igual que en los lenguajes puramente funcionales, los lenguajes funcionales híbridos tratan a las funciones como ciudadanos de primera clase.
- Inmutabilidad selectiva. A diferencia de los lenguajes funcionales puros, los lenguajes funcionales híbridos pueden permitir la mutabilidad de datos en ciertos casos. Esto significa que algunos objetos o estructuras de datos pueden ser mutables y modificados después de su creación.
- Soporte para programación concurrente y paralela. Los lenguajes funcionales híbridos suelen ofrecer características y bibliotecas que facilitan la programación concurrente y paralela.
Evaluación perezosa
La evaluación perezosa, también conocida como evaluación por necesidad, es una estrategia de evaluación utilizada en algunos lenguajes de programación, como Haskell. Las expresiones se tratan como si fueran "cajas" que contienen valores o cálculos pendientes. Cuando se necesita el valor de una expresión, se evalúa solo lo necesario para obtener ese valor y se almacena en memoria para futuros usos. Las partes de la expresión que no se necesitan en ese momento no se evalúan. Esto puede ofrecer ventajas en términos de eficiencia y manejo de estructuras de datos infinitas, pero también puede presentar desafíos en la predicción del momento de evaluación y en el uso de memoria.
Ejemplo de intervalo
Haskell
- Intervalo es el nombre del tipo de dato.
- data es la palabra clave utilizada para definir un nuevo tipo de dato.
- { minimo :: Int, maximo :: Int } especifica los campos del tipo de dato. En este caso, el tipo de dato Intervalo tiene dos campos: minimo y maximo. Ambos campos son de tipo Int, lo que significa que representan números enteros.
- La notación { campo :: Tipo, campo :: Tipo, ... } se utiliza en Haskell para definir registros, que son tipos de datos que contienen varios campos etiquetados.
miIntervalo :: Intervalo miIntervalo = Intervalo { minimo = 0, maximo = 10 }
En este caso, se ha creado un valor del tipo Intervalo llamado miIntervalo. El campo minimo tiene el valor 0 y el campo maximo tiene el valor 10.
Los lenguajes funcionales ofrecen al programador un buen número de recursos expresivos que permiten resolver problemas complejos mediante programas pequeños y robustos.Entre ellos cabe destacar:
- Un sistema de tipos polimórficos. Esto permite definir una amplia variedad de estructuras de datos de uso genérico
- La posibilidad de definir funciones que aceptan otras funciones como argumentos y devuelven funciones como resultado.
- Facilidades para definir y manipular estructuras de datos infinitas.
- Un modelo computacional simple, claro y bien fundamentado
Ejemplo de operadores
Haskell
Operadores aritméticos
Operadores de comparación
Operadores lógicos
Operadores de concatenación de listas
Operadores de acceso a elementos en listas
Tipo de dato lógico
Un dato lógico es aquel que sólo puede tomar valor verdadero o valor falso, es decir que algo se cumpla o no. Un ejemplo puede ser una puerta de paso, que puede estar abierta (asociamos por ejemplo verdadero) o cerrada (falso en este caso por oposición al convenio anterior). Para referenciar este tipo de datos en pseudocódigo se usa la palabra reservada "lógico".
Ejemplo de lista
Haskell
- miLista es el nombre de la variable que contiene la lista.
- :: [Int] especifica el tipo de la variable miLista como una lista de enteros ([Int]).
- [1, 2, 3, 4, 5] es la lista de enteros asignada a la variable miLista. Esta lista contiene los elementos 1, 2, 3, 4 y 5.
- La notación [x, y, z, ...] se utiliza en Haskell para definir listas literales, donde x, y, z, etc., son los elementos individuales de la lista.
primerElemento :: Int primerElemento = miLista !! 0
primerElemento contendrá el valor 1, que es el primer elemento de la lista miLista.
Funciones
Las funciones son bloques de código que toman uno o más valores de entrada, realizan una serie de operaciones y devuelven un resultado. En la programación funcional, las funciones deben ser puras, lo que implica que su resultado solo depende de sus entradas y no tienen efectos secundarios observables. Los programas escritos en un lenguaje funcional están constituidos únicamente por definiciones de funciones, entendiendo éstas no como subprogramas clásicos de un lenguaje imperativo, sino como funciones puramente matemáticas, en las que se verifican ciertas propiedades como la transparencia referencial, y por tanto, la carencia total de efectos colaterales.
Ejemplo de evaluación perezosa
Haskell
- naturales es el nombre de la variable que contiene una lista de enteros.
- :: [Int] especifica el tipo de la variable naturales como una lista de enteros ([Int]).
- [0..] es una notación especial en Haskell que representa una lista infinita que comienza en el número 0 y continúa en incrementos de 1 indefinidamente.
primerosNaturales :: [Int] primerosNaturales = take 5 naturales
Listas
Una lista es un tipo de estructura de datos que permite almacenar y acceder a un conjunto de elementos en un orden específico. Las listas son similares a los arreglos, pero a diferencia de los arreglos, las listas en algunos lenguajes de programación permiten insertar y eliminar elementos en cualquier posición en tiempo de ejecución.
Funcionales puros
Características
- Evaluación basada en expresiones. Los programas se construyen a través de la evaluación de expresiones matemáticas. Cada expresión se evalúa para producir un valor, y la ejecución del programa consiste en evaluar una serie de expresiones interconectadas.
- Funciones puras. Esto significa que el resultado de una función depende exclusivamente de sus argumentos y no tiene efectos secundarios observables en el sistema.
- Inmutabilidad de datos. Significa que una vez que se crea un valor, no se puede modificar.
- Transparencia referencial. Esto significa que una expresión se puede reemplazar por su valor sin cambiar el significado del programa.
- Recursión y recursión estructural. Los lenguajes funcionales puros fomentan el uso de la recursión en lugar de los bucles iterativos.
- Evaluación perezosa. (Da clic aquí para dirigirte a "Evaluación perezosa con más detalle" )
Ejemplo de árbol
Haskell
- Arbol a es el nombre del tipo de dato parametrizado. El parámetro a indica que el tipo de dato puede contener cualquier tipo de valor.
- data es la palabra clave utilizada para definir un nuevo tipo de dato.
- Vacio es un constructor que representa un árbol vacío, es decir, un árbol sin nodos.
- Nodo a (Arbol a) (Arbol a) es otro constructor que representa un nodo en el árbol. Este constructor toma tres argumentos: un valor de tipo a, un subárbol izquierdo de tipo Arbol a y un subárbol derecho de tipo Arbol a.
Evaluación perezosa
La evaluación perezosa, también conocida como evaluación por necesidad, es una estrategia de evaluación utilizada en algunos lenguajes de programación, como Haskell. Las expresiones se tratan como si fueran "cajas" que contienen valores o cálculos pendientes. Cuando se necesita el valor de una expresión, se evalúa solo lo necesario para obtener ese valor y se almacena en memoria para futuros usos. Las partes de la expresión que no se necesitan en ese momento no se evalúan. Esto puede ofrecer ventajas en términos de eficiencia y manejo de estructuras de datos infinitas, pero también puede presentar desafíos en la predicción del momento de evaluación y en el uso de memoria.
Operadores
Los operadores son elementos que relacionan de forma diferente, los valores con los que trabajamos en los lenguajes de programación En los lenguajes de programación usamos los operadores para manipular los valores y transformarlos, con el objetivo de realizar los objetivos de los programas
Intervalos
El intervalo de una variable está definido como la diferencia entre el valor más alto y el valor más bajo que esa variable puede guardar. En el caso de una variable entera, la definición está restringida a números enteros, y el intervalo cubrirá todos los números dentro de su intervalo (incluyendo el máximo y el mínimo). El intervalo de un array son los límites superior e inferior del mismo
Tipo de datos numéricos
Enteros
Reales
Son los que pueden tomar como valores a los números racionales o irracionales. Este tipo de datos admite decimales. En matemáticas se denomina conjunto "R" y es también un conjunto infinito de términos. En este conjunto entre dos términos siempre existen un número infinito de términos. Para éstos, en pseudocódigo, se usa la palabra reservada "real".
Son los números naturales positivos y negativos, más el cero. Se trata de un conjunto infinito de términos que en matemáticas usualmente se denomina "Z", compuesto por los números sin decimales. Cada término crece o decrece según para donde nos desplacemos en una unidad, por ejemplo 12, 13, 14, 15 o -3, -4, -5, -6. Son ejemplos 2, -4 y 0. En pseudocódigo se suele utilizar la palabra reservada "entero" para este tipo de datos.
Tipo de datos de texto
Cadena
Carácter
El conjunto de valores que representa este tipo de datos es el formado por cualquier carácter que pueda representar el ordenador. Normalmente se representan entre comillas, ya sean dobles o simples (dependiendo del lenguaje). En pseudocódigo, para este tipo de datos, se utiliza la palabra reservada "carácter".
Una cadena es una secuencia de caracteres y se representa también normalmente entre comillas. Los espacios en blanco dentro del entrecomillado también son caracteres que forman parte de la cadena, por ejemplo "El gato" es una cadena de 7 caracteres. En pseudocódigo se usa la palabra reservada "cadena" para este tipo de datos.