PDF de programación - Programación Funcional

Imágen de pdf Programación Funcional

Programación Funcionalgráfica de visualizaciones

Publicado el 2 de Junio del 2020
429 visualizaciones desde el 2 de Junio del 2020
60,9 KB
13 paginas
Creado hace 16a (30/10/2007)
Paradigmas de Programación

la visión

Programación funcional

Introducción


La visión tradicional de programación sólo tiene en cuenta la secuencia de
instrucciones que deben suministrarse a una computadora para su operación. Una
visión más amplia de programación debe contemplar además otros aspectos.
Entonces, podría definirse programación como el análisis y solución de problemas
mediante la descripción de valores, propiedades y métodos, el diseño de
algoritmos correctos y eficientes y de estructuras de datos que faciliten las
soluciones, y la codificación de los algoritmos en un formato adecuado para su
ejecución por una computadora. De esta manera,
tradicional
(programación imperativa) queda comprendida como una parte pequeña de dicha
tarea. La programación funcional intenta tratar el problema de la programación
desde un punto de vista matemático, utilizando la noción de función como base
para la construcción de los algoritmos y estructuras de datos.


Los lenguajes de programación imperativos evolucionaron a partir de los
lenguajes ensambladores, cuyo único objetivo era el de proveer una forma de
controlar el comportamiento de una computadora. El proceso de pensamiento de
los programadores no estaba contemplado en el diseño de dichos lenguajes. De
esta manera. los lenguajes imperativos reflejan en gran medida la arquitectura de
las computadoras, y por lo tanto resulta complicado razonar sobre los programas
(por ejemplo, conocer sus propiedades). Los
lenguajes de programación
imperativos de alto nivel abstraen muchas de las características particulares de la
computadora en la que corren, pero no alcanzan a abstraer la arquitectura sobre la
que operan.


En los lenguajes imperativos existen dos tipos de construcciones: los
comandos y las expresiones. Los comandos permiten manejar explícitamente el
flujo de control, y las expresiones son utilizadas para calcular valores.
Por otro lado, los lenguajes imperativos poseen la característica de poder

realizar modificaciones implícitas a la memoria de la computadora. A estas
modificaciones se las conocen como "efectos laterales", ya que no son claramente
visibles en el código del programa, y tienen consecuencias no deseables para el
razonamiento de propiedades. Por ejemplo, la proposición x = x, ¿es verdadera
para cualquier x En matemáticas uno espera que así sea, y así lo es. Pero en un
lenguaje imperativo, esta propiedad tan importante no se cumple; alcanza con
reemplazar x con alguna expresión que contenga efectos laterales, tal como read o
random. Esto sucede pues las expresiones y los comandos pueden entremezclarse
y agregar de esa manera efectos laterales a las primeras. Dichos efectos laterales,
que alteran radicalmente
inducirnos a
malinterpretar lo que escribimos, son la característica fundamental de operación de

la capacidad de razonamiento al

Programación Funcional - Página 1

Paradigmas de Programación

los lenguajes imperativos. Sería altamente deseable que la mismísima estructura
del lenguaje impidiese este tipo de "malentendidos".


¿Cuál es el modelo en el que se basan los lenguajes imperativos? Existen dos
componentes fundamentales: la unidad de procesamiento (CPU) y la memoria, y
ambas están conectadas de manera de poder intercambiar información.



Cuello de botella

Memoria

cpu



Esta conexión puede hacerse con pequeñas cantidades de información por
vez (p. ej. algunos bytes), Pero actualmente se utilizan técnicas como el caching o el
paralelismo, para aumentar la cantidad de información que pasa por este canal. La
CPU entiende instrucciones que le permiten modificar la memoria, y las mismas
deben tener un orden determinado (secuencia explícita de instrucciones) para poder
conocer con exactitud los cambios a realizar. La memoria determina la existencia
de un estado implícito, que puede ser alterado (mediante asignaciones a la misma),
dando por resultado un lenguaje dinámico. Al finalizar la ejecución de un
programa, el estado implícito contiene el valor de resultado (además de muchos
otros valores, irrelevantes al resultado del cálculo que se quería realizar). Como ya
se vio, la secuencia de instrucciones que modifica implícitamente el estado dificulta
el proceso de razonamiento. Como ejemplo, puede considerarse el siguiente código
que muestra un programa para calcular el factorial de un número.



Procedure fac(x)
n : = x;
a : = 1;
while(n > 0) do
a : = a * n;
n : = n -
1;
end while
return a
end proc



Una manera de aligerar estos problemas es tratar de abstraer algunas de
estas nociones (p. ej. mediante procedimientos), pero cuanto mayor es el nivel de
abstracción, mayor es el alejamiento del modelo subyacente. Sería deseable que todas

Programación Funcional - Página 2

Paradigmas de Programación

1



esta inconveniencias fueran evitadas, y la capacidad de razonar fuera restaurada.
Para ello se pueden estudiar las características que hacen que el razonamiento sea
sencillo en matemáticas.

En matemáticas no existe la noción de estado implícito que puede ser
modificado, haciendo innecesaria la presencia de instrucciones. En cambio existen
valores (inmutables) que pueden ser expresados de maneras complejas mediante
expresiones; el conjunto de valores conocidos conforman de esta manera un estado
explícito, dando como resultado un lenguaje estático. El cálculo de dichos valores se
realiza mediante un proceso de reemplazo de subexpresiones que no tienen un
orden preestablecido, dando como resultado un control implícito de operación. Al
no existir efectos laterales, dos expresiones sintácticamente iguales darán el mismo
valor, propiedad conocida como transparencia referencial; esta propiedad es el pilar
de la habilidad de razonamiento. Por ello, aumentar el nivel de abstracción
mantiene la coherencia con el modelo subyacente. Lo siguiente es la definición
matemática de la función factorial:



fac (n )



n*fac(n-1)

, si n>0

, si n=0

Al comparar esta definición con el programa imperativo anterior, se puede
ver claramente que el estado implícito dificulta la capacidad de entender y conocer
las propiedades de este cómputo.

Dado que las expresiones son construcciones conocidas en los lenguajes de
programación, y que las matemáticas las utilizan como base para la denotación de
valores y propiedades, ¿por qué no considerar un lenguaje de programación
compuesto únicamente por expresiones? Un programa en tal lenguaje será un
conjunto de expresiones que denotan valores (con ciertas propiedades). Para que
este lenguaje la posibilidad de seguir escribiendo los mismos algoritmos que antes,
debe incorporarse la noción de función como un concepto primitivo del mismo.


Programar en un lenguaje funcional consiste en construir definiciones y,
utilizando la computadora, evaluar expresiones. El rol principal del programador
es construir una función que resuelva un problema dado. Esta función, que puede
involucrar un cierto número de otras funciones, se expresa en notación basada en
principios matemáticos normales. El rol principal de la computadora es actuar
como una “calculadora”: su trabajo es evaluar expresiones e imprimir resultados.
La diferencia con una calculadora normal es que el programador puede hacer
definiciones para incrementar su poder de cálculo.

Las expresiones que contienen ocurrencias de nombres de funciones
definidas por el programador se evalúan usando las definiciones dadas como
reglas de simplificación o reducción que convierten expresiones en formas
imprimibles.

Programación Funcional - Página 3

Paradigmas de Programación

Una característica de la programación funcional es que si una expresión
posee un valor bien definido, entonces el orden en el cual la computadora lleve a
cabo la evaluación no afecta el resultado.

Las funciones se agregan para suprimir las instrucciones.
¿Cómo construimos definiciones de funciones? Construyendo script. Un

script es una lista de definiciones.

Por ejemplo:



= x, si x<=y
= y, si x>y

cuadrado z = z x z
min x y



En este script definimos dos funciones llamadas cuadrado y min. La función
cuadrado toma un valor z como argumento y retorna el valor de z multiplicado
por sí mismo como resultado. La función min toma dos números x e y como
argumentos y retorna el valor más pequeño.

Sin prestar atención a la sintaxis de las definiciones podemos decir que están
escritas como ecuaciones entre cierto tipo de expresiones. Estas expresiones
pueden contener variables (como en el caso de x e y).

La definición introduce un binding (o ligadura) entre un nombre y un valor
dado. En el ejemplo anterior, el nombre cuadrado se asocia a la dunción que eleva
al cuadrado su argumento y el nombre min está asociado a la función que retorna
el más pequeño de sus dos argumentos.

Un conjunto de binding (o ligaduras) se denomina ambiente o contexto. Las
expresiones siempre se evalúan en el mismo contexto y pueden tener ocurrencias
de nombres encontrados en ese contexto.

El evaluador usará las definiciones asociadas con estos nombres como reglas

Hay un número de operaciones que se consideran como primitivas. Por

En cualquier momento es posible agregar nuevas definiciones al script.

para simplificar las expresiones.

ejemplo, las operaciones a
  • Links de descarga
http://lwp-l.com/pdf17691

Comentarios de: Programación Funcional (0)


No hay comentarios
 

Comentar...

Nombre
Correo (no se visualiza en la web)
Valoración
Comentarios...
CerrarCerrar
CerrarCerrar
Cerrar

Tienes que ser un usuario registrado para poder insertar imágenes, archivos y/o videos.

Puedes registrarte o validarte desde aquí.

Codigo
Negrita
Subrayado
Tachado
Cursiva
Insertar enlace
Imagen externa
Emoticon
Tabular
Centrar
Titulo
Linea
Disminuir
Aumentar
Vista preliminar
sonreir
dientes
lengua
guiño
enfadado
confundido
llorar
avergonzado
sorprendido
triste
sol
estrella
jarra
camara
taza de cafe
email
beso
bombilla
amor
mal
bien
Es necesario revisar y aceptar las políticas de privacidad