Anda di halaman 1dari 6

Unidad ll: Modelo de Programación Funcional

2.1. INTRODUCCIÓN AL MODELO DE PROGRAMACIÓN FUNCIONAL.

El paradigma funcional está basado en el modelo matemático de composición funcional. Utiliza


funciones matemáticas puras sin asignaciones destructivas y sin efecto de lado. (Transforma datos
de entrada en un resultado). Se caracteriza por el uso de expresiones y funciones, una función
puede invocar a otra, o el resultado de una función puede ser usado como argumento de otra
función.

La programación funcional o, mejor dicho, los lenguajes de programación funcionales, son


aquellos lenguajes donde las variables no tienen estado no hay cambios en éstas a lo largo del
tiempo y son inmutables no pueden cambiarse los valores a lo largo de la ejecución. Además, los
programas se estructuran componiendo expresiones que se evalúan como funciones. 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.

2.2. TIPO DE DATOS

Es un atributo de una parte de los datos que indica al ordenador (y/o al programador) algo sobre
la clase de datos sobre los que se va a procesar. Esto incluye imponer restricciones en los datos,
como qué valores pueden tomar y qué operaciones se pueden realizar. Tipos de datos comunes
son: enteros, números de coma flotante (decimales), cadenas alfanuméricas, fechas, horas,
colores, etc.

Por ejemplo, por lo general el tipo "int" representa un conjunto de enteros de 32 bits cuyo rango
va desde el -2.147.483.648 al 2.147.483.647, así como las operaciones que se pueden realizar con
los enteros, como son la suma, la resta, y la multiplicación. Los colores, por su parte, se
representan como tres bytes denotando la cantidad de rojo, verde y azul, y una cadena de
caracteres representando el nombre del color; las operaciones permitidas en este caso incluyen la
adición y la sustracción, pero no la multiplicación.

Este es un concepto propio de la informática, más específicamente de los lenguajes de


programación, aunque también se encuentra relacionado con nociones similares de la
matemática y la lógica.

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 adicionales,
normalmente combinando múltiples elementos de otros tipos y definiendo las operaciones del
nuevo tipo de dato. 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
y una fecha de nacimiento.

Un tipo de dato puede ser también visto como una limitación impuesta en la interpretación de los
datos en un sistema de tipificación, describiendo la representación.
La interpretación y la estructura de los valores u objetos almacenados en la memoria del
ordenador. El sistema de tipificación usa información de los tipos de datos para comprobar
la verificación de los programas que acceden o manipulan los datos.

2.3. FUNCIONES

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 (el significado de una expresión depende únicamente del significado
de sus sobrexpresiones) y, por tanto, la carencia total de efectos colaterales.

Existen dos grandes categorías de lenguajes funcionales: los funcionales puros y los híbridos. La
diferencia entre ambos estriba en que los lenguajes funcionales híbridos son menos dogmáticos
que los puros, al admitir conceptos tomados de los lenguajes imperativos, como las secuencias de
instrucciones o la asignación de variables. En contraste, los lenguajes funcionales puros tienen una
mayor potencia expresiva, conservando a la vez su transparencia referencial, algo que no se
cumple siempre con un lenguaje funcional híbrido.

Funciones de primera clase y de orden superior

Funciones de orden superior son funciones que pueden tomar otras funciones como argumentos o
devolverlos como resultados. En cálculo, un ejemplo de una función de orden superior es el
operador diferencial d / dx, que devuelve la derivada de una función f.

Las funciones de orden superior están estrechamente relacionadas con las funciones de primera
clase en las cuales las funciones de orden superior y las funciones de primera clase pueden recibir
como argumentos y resultados otras funciones. La distinción entre los dos es sutil: "de orden
superior", describe un concepto matemático de funciones que operan sobre otras funciones,
mientras que la "primera clase" es un término informático que describe las entidades del lenguaje
de programación que no tienen ninguna restricción de su utilización (por lo tanto funciones de
primera clase pueden aparecer en cualquier parte del programa que otras entidades de primer
nivel como los números pueden, incluidos como argumentos a otras funciones y como sus valores
de retorno).

Las funciones de orden superior permiten la aplicación parcial, una técnica en la que se aplica una
función a sus argumentos uno a la vez, con cada aplicación devolver una nueva función que acepta
el siguiente argumento. Esto le permite a uno expresar, por ejemplo, la función sucesora como el
operador de suma aplicada parcialmente al número natural uno.

Funciones puras

Las funciones puramente funcionales (o expresiones) no tienen efectos secundarios (memoria o


E/S). Esto significa que las funciones puras tienen varias propiedades útiles, muchas de las cuales
pueden ser utilizados para optimizar el código:

· Si no se utiliza el resultado de una expresión pura, se puede eliminar sin afectar a otras
expresiones.
· Si una función pura se llama con parámetros que no causan efectos secundarios, el resultado es
constante con respecto a la lista de parámetros (a veces llamada transparencia referencial), es
decir, si la función pura se llama de nuevo con los mismos parámetros, el mismo resultado será
devuelto (esto puede habilitar las optimizaciones de almacenamiento en caché).

· Si no hay una dependencia de datos entre dos expresiones puras, entonces su orden puede ser
invertido, o pueden llevarse a cabo en paralelo y que no pueda interferir con los otros.

· Si el lenguaje no permite efectos secundarios, entonces cualquier estrategia de evaluación se


puede utilizar, lo que da la libertad al compilador para reordenar o combinar la evaluación de
expresiones en un programa (por ejemplo, usando la poda).

La mayoría de los compiladores de lenguajes imperativos detectan funciones puras


automáticamente y realizan la eliminación de sub-expresiones comunes. Sin embargo, no siempre
es posible detectarlo en bibliotecas pre-compiladas, porque por norma general no dan esta
información. Esto provoca que no se puedan realizar optimizaciones que podrían aplicar a dichas
funciones externas. algunos compiladores, como gcc, sí que añaden palabras claves adicionales
para que el programador marque explícitamente como puras aquellas funciones externas que
procedan, de modo que se le apliquen las optimizaciones pertinentes. fortran 95 también permite
que declarar funciones "puras".

2.4. 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, el intervalo cubrirá todos los números dentro de su intervalo
(incluyendo el máximo y el mínimo).

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 es los límites superior e inferior del mismo.

Diferencia entre declaración y modificación de variables

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 programación imperativa es habitual modificar el valor de una variable en distintos pasos de


ejecución.
2.5. OPERADORES

En programación declarativa sólo existen valores, no hay referencias.

La distinción entre valores y referencias es fundamental, sin embargo, en la programación


imperativa.

Diferencia entre valor y referencia

Cuando se realiza una asignación de un valor a una variable debemos considerar que estamos
dando un nombre a un objeto matemático que no puede ser modificado o que estamos copiando
el valor en la variable.

Por ejemplo, en java, los tipos de datos primitivos son valores. las asignaciones valores de estos
tipos a variables realizan copias de valores:

En la variable a se copia el valor 4 y en las variables b y c se copia el valor 2. No hay forma de


modificar (mutar) esos valores. Podríamos cambiar las variables guardando en ella otros valores,
pero los valores propiamente dichos son inmutables. En la última instrucción modificamos el valor
de la variable b, pero el valor de la variable c sigue siendo 2.

Los tipos de datos cuyos valores son inmutables y sus asignaciones tienen una semántica de copia
reciben el nombre de tipos de valor (value types en inglés).

Los tipos de referencia son tipos de datos mutables en los que la asignación funciona con
semántica de referencia.

Por ejemplo, cualquier objeto en java tiene una semántica de referencia. Cuando asignamos un
objeto a una variable, estamos guardando en la variable una referencia al objeto.

2.6. APLICACIONES DE LAS LISTAS

Una lista enlazada es una de las estructuras de datos fundamentales, y puede ser usada para
implementar otras estructuras de datos. Consiste en una secuencia de nodos, en los que se
guardan campos de datos arbitrarios y una o dos referencias, enlaces o punteros al nodo anterior
o posterior. El principal beneficio de las listas enlazadas respecto a los vectores convencionales es
que el orden de los elementos enlazados puede ser diferente al orden de almacenamiento en la
memoria o el disco, permitiendo que el orden de recorrido de la lista sea diferente al de
almacenamiento.

Las listas enlazadas permiten inserciones y eliminación de nodos en cualquier punto de la lista en
tiempo constante (suponiendo que dicho punto está previamente identificado o localizado), pero
no permiten un acceso aleatorio. Existen diferentes tipos de listas enlazadas: listas enlazadas
simples, listas doblemente enlazadas, listas enlazadas circulares y listas enlazadas doblemente
circulares.

algunas funciones:

caracteres (tipo char)

cadenas (tipo string)


tipos numéricos: int, float

componentes:

 Los parámetros, que son los valores que recibe la función como entrada
 El código de la función, que son las operaciones que hace la función el resultado (o valor
de retorno), que es el valor final que entrega la función.

2.7. ARBOLES

En informática un árbol es una estructura de datos ampliamente usada que imita la forma de un
árbol (un conjunto de nodos conectados). Un nodo es la unidad sobre la que se construye el árbol
y puede tener cero o más nodos hijos conectados a él. Se dice que un nodo es padre de un nodo si
existe un enlace desde hasta (en ese caso, también decimos que es hijo de). Sólo puede haber un
único nodo sin padres, que llamaremos raíz. un nodo que no tiene hijos se conoce como hoja. Los
demás nodos (tienen padre y uno o varios hijos) se les conoce como rama.

Formalmente, podemos definir un árbol de la siguiente forma:

· Caso base: un árbol con sólo un nodo (es a la vez raíz del árbol y hoja).

· Un nuevo árbol a partir de un nodo y árboles de raíces con elementos cada uno, puede
construirse estableciendo una relación padre-hijo entre y cada una de las raíces de los árboles. El
árbol resultante de nodos tiene como raíz el nodo, los nodos son los hijos de y el conjunto de
nodos hoja está formado por la unión de los conjuntos hojas iniciales. A cada uno de los árboles se
les denota ahora subárboles de la raíz.

Usos comunes de los árboles son:

· Representación de datos jerárquicos.

· Como ayuda para realizar búsquedas en conjuntos de datos (ver también: algoritmos de
búsqueda en Árboles).

2.8. LA EVALUACIÓN PEREZOSA

En la teoría de lenguajes de programación, La evaluación perezosa (del inglés lazy evaluation) o


llamada por necesidad es una estrategia de evaluación que retrasa el cálculo de una expresión
hasta que su valor sea necesario, y que también evita repetir la evaluación en caso de ser
necesaria en posteriores ocasiones. Esta compartición del cálculo puede reducir el tiempo de
ejecución de ciertas funciones de forma exponencial, comparado con otros tipos de evaluación.

Los beneficios de la evaluación perezosa son:

 El incremento en el rendimiento al evitar cálculos innecesarios, y en tratar condiciones de


error al evaluar expresiones compuestas.
 La capacidad de construir estructuras de datos potencialmente infinitas.
 La capacidad de definir estructuras de control como abstracciones, en lugar de
operaciones primitivas.
Este método de evaluación es comúnmente implementado encapsulando cada expresión en una
función que, cuando sea computada, devolverá el valor deseado de la expresión. De esta manera,
cuando el resultado sea necesitado, la función creada será ejecutada para conseguirlo.

La evaluación perezosa puede también reducir el consumo de memoria de una aplicación, ya que
los valores se crean solo cuando se necesitan. Sin embargo, es difícil de combinar con las
operaciones típicas de programación imperativa, como el manejo de excepciones o las
operaciones de entrada/salida, porque el orden de las operaciones puede quedar indeterminado.
Además, la evaluación perezosa puede conducir a fragmentar la memoria.

La evaluación perezosa es frecuentemente combinada con memoización, tal y como lo describe


Jon Bentley en Writing Efficient Programs (Escribiendo Programas Eficientes). Después de que el
valor de una función sea computado para un parámetro o una serie de estos, el resultado es
almacenado en una tabla de consulta que está organizada por los valores de estos parámetros; la
próxima vez que se le llama a la función, la tabla es consultada para determinar si el resultado
para esa combinación de parámetros está disponible. Si es el caso, la función devuelve dicho
resultado. Si no, la función es evaluada y otro elemento es añadido a la tabla para reutilización
posterior.

Lo contrario de la evaluación perezosa sería la evaluación acaparadora, o evaluación estricta, que


es el modo de evaluación por defecto en la mayoría de los lenguajes de programación.

Conclusión:

Vemos que en esta unidad nos habla lo que es la programación funcional, que es un paradigma
basado en la utilización de funciones aritméticas. La programación funcional tiene sus raíces en
el cálculo lambda, un sistema formal desarrollado en los años 1930 para investigar la definición de
función, la aplicación de las funciones y la recursión. Muchos lenguajes de programación
funcionales pueden ser vistos como elaboraciones del cálculo lambda.

Los lenguajes de programación funcional, especialmente los que son puramente funcionales, han
sido enfatizados en el ambiente académico principalmente y no tanto en el desarrollo de software
comercial.

Sin embargo, lenguajes de programación importantes tales como scheme,erlang, rust, objective
caml y haskell, han sido utilizados en aplicaciones comerciales e industriales por muchas
organizaciones.

Anda mungkin juga menyukai