Logo Studenta

[Espanhol] Projeto sobre Programacao Funcional

¡Este material tiene más páginas!

Vista previa del material en texto

UNIVERSIDAD DE PANAMÁ
CENTRO REGIONAL DE VERAGUAS
FACULTAD DE INFORMÁTICA, ELECTRONICA Y COMUNICACIONES
LICENCIATURA EN INGENIERIA EN INFORMATICA
ESTRUCTURA DE LOS LENGUAJES DE PROGRAMACION
PROGRAMACION FUNCIONAL”
Por:
Abrego, Alexander 9-000-0000
Caballero, Efraín 9-719-1952
Castillo, Jonathan 9-000-0000
De Gracia, Carlos 9-721-0393
Profesor:
Diego Santimateo
III Año
II Semestre
31 Octubre 2007
Paradigma de Programación Funcional 
_________________________________________________________________________________
CONTENIDO
INTRODUCCION ......................................................................................... .......................... 3 
Objetivos ...................................................................................................... ....................... 5 
Propósito .............................................................................................. ............................... 5 
Delimitación de tema ................................................................................... ....................... 5 
I.GENERALIDADES DEL PARADIGMA DE PROGRAMACION FUNCIONAL ................................. 6 
Historia y evolución de los lenguajes funcionales ......................................................... 7 
Fundamentos de los lenguajes funcionales .................................................................. 9 
Lenguajes funcionales ......................................................................................... ....... 10 
Ventajas e inconvenientes sobre los lenguajes funcionales ....................................... 12 
Características de los lenguajes funcionales ............................................................... 13 
II.STANDARD ML .................................................................................. .............................. 17 
CONCLUSIONES ........................................................................................... ...................... 23 
REFERENCIAS ELECTRONICAS ........................................................................................... 24 
_________________________________________________________________________________
2
Paradigma de Programación Funcional 
_________________________________________________________________________________
INTRODUCCION
La programación funcional nació como una proyección para realizar programas, los 
cuales pretenden cubrir el campo de desarrollo de aplicaciones cuya solución se soporte o 
fundamente en teorías o definiciones matemáticas.
Los lenguajes funcionales se basan en la idea de que un programa es una función con 
un parámetro de entrada (la entrada) y un resultado (la salida). La ejecución de un programa 
se ve como la aplicación de una función a la entrada, resultando en la salida. Lo que subyace 
en el modelo de computación funcional es que un programador a la hora de escribir 
programas piensa más en términos de qué es lo que lo que va a computar, en lugar de cómo, 
cuándo y dónde. En un lenguaje funcional puro, no hay instrucciones de ningún tipo, 
especialmente no hay instrucción de asignación especificando una variable o localización de 
memoria donde se debe almacenar el resultado de un cómputo. Es decir, no existe el 
concepto de estado. La computación se organiza mediante composición de funciones y los 
valores que se computan son los resultados de una función que constituyen su salida.
El objetivo del paradigma funcional es conseguir lenguajes expresivos y 
matemáticamente elegantes, en los que no sea necesario bajar al nivel de la máquina para 
describir el proceso llevado a cabo por el programa, y evitando el concepto de estado del 
cómputo. Todo esto con el objetivo de familiarizarse con un lenguaje elegante en el cual se 
pueda manejar más fácilmente y así los programas sean menos extensos y complejos. Otro 
de los objetivos primordiales de dicho paradigma es buscar satisfacer las necesidades del 
usuario con respecto a operaciones matemáticas y convertirse en un lenguaje más 
expresivo.
Organización del documento
El desarrollo del siguiente proyecto estará estructurado de la siguiente manera:
Como primer punto conoceremos los objetivos del desarrollo de este proyecto y su 
propósito. 
_________________________________________________________________________________
3
Paradigma de Programación Funcional 
_________________________________________________________________________________
En una segunda parte conoceremos las generalidades de la Programación Funcional, 
su historia y evolución, sus fundamentos, descripción de algunos lenguajes funcionales 
existentes, ventajas e inconvenientes asociados a este tipo de programación. 
En el punto tres se explicarán y propondrán cuatro programas mediante el lenguaje 
funcional SML adoptado por los estudiantes que realizan este proyecto de investigación. 
Para finalizar se presentarán las conclusiones y observaciones tomadas de nuestra 
experiencia en el desarrollo de este proyecto de investigación.
_________________________________________________________________________________
4
Paradigma de Programación Funcional 
_________________________________________________________________________________
Objetivos
Los objetivos esperados con el desarrollo de este proyecto los podemos resumir en dos 
puntos:
• Identificar las características de la programación funcional.
• Diseñar y codificar un programa utilizando el lenguaje de programación funcional SML.
Propósito
Este proyecto tiene como propósito presentar una documentación que permita conocer 
las características de la programación funcional, además de valorar la solución de los 
problemas propuestos a través de este tipo de programación.
Delimitación de tema
En la elaboración de este proyecto se hará uso de Standard ML para el desarrollo de 
los programas de ejemplo.
_________________________________________________________________________________
5
Paradigma de Programación Funcional 
_________________________________________________________________________________
I. GENERALIDADES DEL PARADIGMA DE PROGRAMACION FUNCIONAL
El paradigma de programación funcional es uno de los principales modelos entre los 
denominados modelos de programación declarativa. Como tal, permite aunar los 
componentes de especificación y programación en las tareas de solución automática de 
problemas.
Los lenguajes funcionales ofrecen alprogramador un buen número de recursos 
expresivos que permiten resolver problemas complejos mediante programas pequeños y 
robustos.
Permite:
• Definir una amplia variedad de estructuras de datos de uso genérico.
• Definir funciones que aceptan otras funciones como argumentos. (Funciones de más 
alto orden).
La programación funcional es caracterizada por el uso de expresiones, funciones, a 
diferencia de la programación imperativa que usa variables y acceso a memoria explicita, la 
programación funcional no maneja acceso a memoria explícitamente. La forma básica de 
programar en los lenguajes de programación funcional es mediante la recursión y utiliza el 
concepto básico de una función:
• El diseño de un lenguaje funcional está basado en funciones matemáticas.
• Los lenguajes funcionales mantienen una base teórica sólida muy cercana al usuario, 
pero muy poco relacionada con el funcionamiento de las máquinas en donde corren 
los programas.
• Un lenguaje de programación funcional excluye comandos y variables lo que lo hace 
adecuada para aplicaciones de inteligencia artificial.
_________________________________________________________________________________
6
Paradigma de Programación Funcional 
_________________________________________________________________________________
Según Fuctional Programming Community, La Programación funcional es un modelo de 
programación que enfatiza la evaluación de expresiones más que la ejecución de comandos, 
como en el caso de la programación imperativa. Las expresiones, aquí, están formadas por 
funciones que combinan valores básicos. Un Lenguaje Funcional es un lenguaje que soporta 
el modelo de programación funcional.
Historia y evolución de los lenguajes funcionales
Los primeros ordenadores se construyeron en los años cuarenta. Los primerísimos 
modelos fueron ‘programados’ con grandes relés. Pronto se almacenaron los programas en 
la memoria del ordenador, haciendo que los primeros lenguajes de programación hicieran su 
entrada.
En aquel tiempo el uso de un ordenador era muy costoso y era lógico que el lenguaje 
de programación guardara mucha relación con la arquitectura del ordenador. Un ordenador 
consta de una unidad de control y una memoria. Por eso un programa consistía en 
instrucciones para cambiar el contenido de la memoria. La unidad de control se encargaba 
de ejecutarlas. De esta manera se creó el estilo de programación imperativa. Los lenguajes 
de programación imperativa como Pascal y C se caracterizan por la existencia de 
asignaciones ejecutadas consecutivamente.
Antes de la existencia de los ordenadores se inventaron métodos para resolver 
problemas. Por tanto, no existía la necesidad de hablar en términos de una memoria que 
cambie por instrucciones en un programa.
En la matemática de los últimos cuatrocientos años son muy importantes las 
funciones. Estas establecen la relación entre los parámetros (la ‘entrada’) y el resultado (la 
‘salida’) de procesos definidos.
Con cada computación, el resultado depende de una u otra forma de los parámetros. 
Por esa razón, una función es una buena manera de especificar una computación. Esta es la 
base del estilo de programación funcional. Un ‘programa’ consiste en la definición de una o 
_________________________________________________________________________________
7
Paradigma de Programación Funcional 
_________________________________________________________________________________
más funciones. Para la ejecución de un programa, se dan parámetros a una función y el 
ordenador tiene que calcular el resultado. Con este tipo de computación existe libertad en la 
manera de ejecución. ¿Por qué tendría que describirse en qué orden deben ejecutarse las 
computaciones parciales? 
Con el tiempo, al bajar los precios de los ordenadores y al subir los precios de los 
programadores, llega a ser más importante describir las computaciones en un lenguaje que 
esté más cerca del ‘mundo del hombre’, que cerca del ordenador. Los lenguajes funcionales 
se unen a la tradición matemática y no están muy influidos por la arquitectura concreta del 
ordenador.
La base teórica de la programación imperativa fue dada (en Inglaterra) por Alan Turing 
en los años treinta.
También la teoría de funciones como modelo de computación proviene de los años 
veinte y treinta. Los fundadores son, entre otros, M. Schönfinkel (en Alemania y Rusia), 
Haskell Curry (en Inglaterra) y Alonzo Church (en los Estados Unidos).
Fue en el comienzo de los años cincuenta cuando a alguien se le ocurrió usar esta 
teoría efectivamente, como base de un lenguaje de programación. El lenguaje Lisp de John 
McCarthy fue el primer lenguaje de programación funcional y fue el único por muchos años. 
Aunque todavía se usa Lisp, no es un lenguaje que reúna las exigencias. Debido a la 
creciente complejidad de los programas de ordenador, se hizo necesaria una mayor 
verificación del programa por parte del ordenador. Por ello el tipado adquirió una gran 
importancia. Por eso no es de extrañar que en los años ochenta se crearan un gran número 
de lenguajes funcionales tipados. Algunos ejemplos son ML, Scheme (una adaptación de 
Lisp), Hope y Miranda.
A la larga, cada investigador se dedicó a desarrollar su propio lenguaje. Para detener 
este crecimiento incontrolado, un grupo de investigadores notables concibió un lenguaje que 
incluía todas las mejores cualidades de los diferentes lenguajes. Este lenguaje se llama 
Haskell. Las primeras implementaciones de Haskell fueron hechas a comienzos de los años 
noventa. Este lenguaje es bastante ambicioso y de difícil implementación. 
_________________________________________________________________________________
8
Paradigma de Programación Funcional 
_________________________________________________________________________________
Fig. 1 – Evolución de los lenguajes funcionales
Fundamentos de los lenguajes funcionales 
El objetivo del diseño de un lenguaje de programación funcional es imitar las funciones 
matemáticas hacia el mayor número de aplicaciones posibles.
Los programas escritos en un lenguaje funcional están constituidos únicamente por 
definiciones de funciones, entendiendo éstas 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 subexpresiones), y por tanto, la 
carencia total de efectos laterales.
_________________________________________________________________________________
9
Paradigma de Programación Funcional 
_________________________________________________________________________________
Otras características propias de estos lenguajes son la no existencia de asignaciones 
de variables y la falta de construcciones estructuradas como la secuencia o la iteración (lo 
que obliga en la práctica a que todas las repeticiones de instrucciones se lleven a cabo por 
medio de funciones recursivas).
Existen dos grandes categorías de lenguajes funcionales: los funcionales puros y los 
híbridos. La diferencia entre ambos apunta en que los lenguajes funcionales híbridos son 
menos dogmáticos que los puros, al admitir conceptos tomados de los lenguajes 
procedimentales, 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.
Un lenguaje de programación funcional provee:
• Un conjunto defunciones primitivas
• Un conjunto de formas funcionales para construir funciones complejas a partir de 
éstas funciones primitivas.
• Algunas estructuras para representar datos.
Lenguajes funcionales 
Entre los lenguajes funcionales puros, cabe destacar a Haskell y Miranda. Los 
lenguajes funcionales híbridos más conocidos son Lisp, Scheme, Ocaml y Standard ML 
(estos dos últimos, descendientes del lenguaje ML).
Algunos de los lenguajes funcionales de propósito general más conocidos son ML y 
Haskell. ML tiene múltiples versiones y lenguajes derivados. La versión estándar se conoce 
_________________________________________________________________________________
10
Paradigma de Programación Funcional 
_________________________________________________________________________________
como SML, otra muy significativa y difundida es una forma orientada a objetos denominada 
CAML. Información de interés para estos lenguajes se puede encontrar siguiendo los 
enlaces:
• http://www.haskell.org/ 
• http://www.smlnj.org/ 
• http://caml.inria.fr/ 
Los matemáticos desde hace un buen tiempo están resolviendo problemas usando el 
concepto de función. Una función convierte ciertos datos en resultados. Si supiéramos cómo 
evaluar una función, usando la computadora, podríamos resolver automáticamente muchos 
problemas.
Así pensaron algunos matemáticos, que no le tenían miedo a la máquina, e inventaron 
los lenguajes de programación funcionales. Además, aprovecharon la posibilidad que tienen 
las funciones para manipular datos simbólicos, y no solamente numéricos, y la propiedad de 
las funciones que les permite componer, creando de esta manera, la oportunidad para 
resolver problemas complejos a partir de las soluciones a otros más sencillos. También se 
incluyó la posibilidad de definir funciones recursivamente.
Un lenguaje funcional ofrece conceptos que son muy entendibles y relativamente 
fáciles de manejar. El lenguaje funcional más antiguo, y seguramente el más popular hasta la 
fecha, es LISP, diseñado por McCarthy en la segunda mitad de los años 50. Su área de 
aplicación es principalmente la Inteligencia Artificial. En la década de los 80 hubo una nueva 
ola de interés por los lenguajes funcionales, añadiendo la tipificación y algunos conceptos 
modernos de modularización y polimorfismo, como es el caso del lenguaje ML.
Programar en un lenguaje funcional significa construir funciones a partir de las ya 
existentes. Por lo tanto es importante conocer y comprender bien las funciones que 
conforman la base del lenguaje, así como las que ya fueron definidas previamente. De esta 
manera se pueden ir construyendo aplicaciones cada vez más complejas.
_________________________________________________________________________________
11
Paradigma de Programación Funcional 
_________________________________________________________________________________
Ventajas e inconvenientes sobre los lenguajes funcionales 
Las ventajas de tener un lenguaje tan simple son:
• Permite definiciones simples.
• Facilita el estudio de aspectos computacionales.
• Su carácter formal facilita la demostración de propiedades.
• Ofrecen la posibilidad que tienen las funciones para manipular datos simbólicos, 
y no solamente numéricos, y la propiedad de las funciones que les permite 
componer, ofreciendo de esta manera soluciones más complejas a los 
problemas.
• Permite la aplicación del concepto de recursividad.
• Ofrece conceptos que son muy entendibles y relativamente fáciles de manejar.
• Ofrecen al programador un buen número de recursos expresivos que permiten 
resolver problemas complejos mediante programas pequeños y robustos.
• Un sistema de tipos polimórficos que 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.
• Posee un sistema de tipos fuerte, de forma que el código está más protegido de 
errores.
• Los lenguajes funcionales son muy adecuados para realizar programas donde 
se exija un alto grado de paralelismo.
• Los errores se pueden depurar fácilmente.
• Es muy fácil pasar de la especificación del problema a la implementación, 
_________________________________________________________________________________
12
Paradigma de Programación Funcional 
_________________________________________________________________________________
debido al alto grado de abstracción que ofrecen.
• La capacidad computacional de los lenguajes funcionales es equivalente a la de 
la máquina de Turing.
Las desventajas del modelo funcional son:
• Resulta bastante alejado del modelo de la máquina de von Neumann y, por lo 
tanto, la eficiencia de ejecución de los intérpretes de lenguajes funcionales no 
es comparable con la ejecución de los programas imperativos pre compilados.
• El rendimiento de los programas puede resultar bajo.
• Algunos algoritmos son de carácter imperativo y no se ajustan bien al 
estilo funcional.
• Se consideraron en sus primeras versiones ineficientes (reserva y liberación 
automática de memoria).
• Complicados (alto grado de recursividad).
• Las variables sólo pueden tener asignado un solo valor a lo largo de la 
ejecución del programa, lo cual implica que no puede existir asignación 
destructiva.
Características de los lenguajes funcionales
El modelo funcional, tiene como objetivo la utilización de funciones matemáticas puras 
sin efectos laterales y, por tanto, sin asignaciones destructivas.
En el esquema del modelo funcional se establece una sesión interactiva (parecida a la 
e una calculadora), entre sistema y usuario: el usuario introduce una expresión inicial y el 
_________________________________________________________________________________
13
Paradigma de Programación Funcional 
_________________________________________________________________________________
sistema la evalúa mediante un proceso de reducción. En este proceso se utilizan las 
definiciones de función realizadas por el programador hasta obtener un valor no reducible.
Fig. 2 – Modelo Funcional
El valor que devuelve una función está únicamente determinado por el valor de sus 
argumentos consiguiendo que una misma expresión tenga siempre el mismo valor (esta 
propiedad se conoce como transparencia referencial). Es más sencillo demostrar la 
corrección de los programas ya que se cumplen propiedades matemáticas tradicionales 
como la propiedad conmutativa, asociativa, etc.
El programador se encarga de definir un conjunto de funciones sin preocuparse de los 
métodos de evaluación que posteriormente utilice el sistema. Este modelo deja mayor 
libertad al sistema de evaluación para incorporar pasos intermedios de transformación de 
código y paralelización ya que las funciones no tienen efectos laterales y no dependen de 
una arquitectura concreta.
La importancia de la programación funcional no radica únicamente en no utilizar 
asignaciones destructivas. Por el contrario, este modelo promueve la utilización de una serie 
de características como las funciones de orden superior, los sistemas de inferencia de tipos, 
el polimorfismo, la evaluación perezosa, etc.
 Funciones de orden superior
Otra idea importante en la programación funcional es el concepto de función de 
orden superior, es decir, funciones que toman otrasfunciones como sus argumentos, o 
_________________________________________________________________________________
14
Paradigma de Programación Funcional 
_________________________________________________________________________________
bien, regresan funciones como su resultado. La derivada y la anti derivada en el 
cálculo, son ejemplos de funciones que mapean a otras funciones. En el contexto de la 
computación, a estas funciones se les suele llamar también funciones de primera 
clase.
Fig. 3 – Ejemplo de función de orden superior
En el ejemplo anterior, la función reaplica tiene como argumentos una función f 
(que toma elementos de un tipo Integer y devuelve elementos de tipo Integer) y un 
valor x (de tipo Integer). La llamada reaplica (incr, 0) equivale a aplicar la función incr 
dos veces sobre el valor cero, es decir, equivale a incr(incr(0)). 
La utilización de funciones de orden superior proporciona una mayor flexibilidad 
al programador, siendo una de las características más sobresalientes de los lenguajes 
funcionales. De hecho, en algunos ámbitos se considera que la propiedad que 
distingue un lenguaje funcional de otro es la utilización de funciones de orden superior.
 Sistemas de Inferencia de Tipos y Polimorfismo
Los sistemas de inferencia de tipos permiten una mayor seguridad evitando 
errores de tipo en tiempo de ejecución y una mayor eficiencia, evitando realizar 
comprobaciones de tipos en tiempo de ejecución.
_________________________________________________________________________________
15
Paradigma de Programación Funcional 
_________________________________________________________________________________
Por ejemplo, si el programador declara la siguiente función:
EligeSaludo x = if x then "adios"
 Else "hola"
El sistema infiere automáticamente que el tipo es EligeSaludo::Bool -> String y, 
si el programador hubiese declarado que tiene un tipo diferente, el sistema daría un 
error de tipos.
Los sistemas de inferencia de tipos aumentan su flexibilidad mediante la 
utilización de polimorfismo.
El polimorfismo permite que el tipo de una función dependa de un parámetro. 
Por ejemplo, si se define una función que calcule la longitud de una lista, una posible 
definición sería:
 long ls = IF vacia(L) then 0
 else 1 + long(cola(L)); 
 
El sistema de inferencia de tipos inferiría el tipo3: long::[x] -> Integer, indicando 
que tiene como argumento una lista de elementos de un tipo a cualquiera y que 
devuelve un entero.
_________________________________________________________________________________
16
Paradigma de Programación Funcional 
_________________________________________________________________________________
II. STANDARD ML
Standard ML es un lenguaje de programación funcional, y más que eso. Los 
programas Funcionales tienen muchas virtudes. Son concisos, seguro y elegante. Son más 
fáciles de entender y más fácil de corregir que los programas imperativos
El lenguaje Funcional alivia al programador de muchas de las dificultades que, 
lamentablemente ocupan una gran parte del tiempo a un programador que trabaja con 
lenguajes imperativos. Estas dificultades van desde la ejecución de rutinas reutilizables para 
la conservación y la gestión de memoria hasta la representación de los valores de datos. 
Algunos de estos tienen responsabilidades consiguientes. Una vez que los programadores 
comprenden cómo están representados los valores en la memoria, ellos deberían 
posteriormente garantizar su inspección y actualizado, de una manera que es consistente 
con la representación. Incluso después de que las dificultades de la gestión de la máquina 
principal de la memoria han sido comprendidas, todavía existen las dificultades de transferir 
datos de la memoria principal a la memoria secundaria y las complicaciones de los 
mecanismos de acceso a disco y de entrada / salida a bibliotecas.
Un programador funcional puede trascender estas cuestiones. Lenguajes aplicativos 
tienen que asegurar los sistemas de tipo polimórficos que simplifican la tarea de escritura 
reutilizables, de rutinas de uso general. Los lenguajes funcionales ocultan la máquina de la 
representación de los datos, por lo que es imposible escribir programas que son sensibles a 
la orden de bytes de la máquina subyacente o de introducir otras dependencias no deseadas. 
Usando el disco de entrada de rutinas puede ser evitado debido a la naturaleza interactiva de 
lenguajes funcionales que permiten a los datos que se ha de efectuar con un mínimo de 
riesgo. Usando el disco de salida de rutinas puede ser evitado por el usuario que permite a la 
exportación al exterior, tan fácilmente como puntos de acceso a una base de datos. Por 
supuesto algún lenguaje de programación debe ofrecer rutinas de entrada y salida de disco, 
la pantalla y el teclado, pero su uso se puede evitar muchos de los problemas de 
programación funcional.
_________________________________________________________________________________
17
Paradigma de Programación Funcional 
_________________________________________________________________________________
Los lenguajes Funcionales tienen deficiencias. Se podría decir que algunos problemas 
de programación parece ser intrínsecamente con base en el estado. La uniformidad de la 
representación que lenguajes funcionales ofrecen a continuación, se convierte en una 
desventaja. Aunque una solución a ese problema sería posible que quizas tenga una 
codificación oscura o antinatural. Otra posible preocupación es que la aplicación funcional 
podría ser ineficaz en comparación con un simple lenguaje imperativo. Esto sería una 
vergüenza, un lenguaje de programación no debería hacer difícil para un programador 
escribir programas eficientes.
Standard ML es un lenguaje interactivo. Las expresiones son introducidas, compiladas 
y luego evaluado. El resultado de la evaluación es mostrada y la siguiente expresión quizás 
sea introducida. Este estilo de trabajo interactivo combina bien con el mecanismo de 
inferencia de tipos de Standard ML que habilita a los programadores para trabajar en forma 
flexible, de forma experimental, desplazándose libremente desde la definición de nuevas 
funciones para tratar la función de algunos de los datos de prueba y, a continuación, 
modificar la función o moverla sobre otra definición.
El hecho de que los tipos son asignados por el compilador también tiene la 
consecuencia favorable de que las funciones Standard ML son generalmente más cortas que 
las rutinas comparables aplicadas en los lenguajes en los que los tipos de variables, se 
presentarán cuando la variable es declarada.
Las expresiones escritas son evaluadas inmediatamente y por lo general aparece 
junto con el tipo de resultado. Las expresiones finalizan con ",". Usando New Jersey ML el 
siguiente diálogo podría tener lugar: 
- "Hola Mundo"; 
val it = "Hello World": string
Cuando se utiliza normalmente ML acepta las expresiones y las evalúa. El resultado 
es mostrado en la pantalla junto con el tipo del resultado. El último resultado calculado se 
puede referencias como el mismo. En el ejemplo anterior, el intérprete no tiene que hacer 
_________________________________________________________________________________
18
Paradigma de Programación Funcional 
_________________________________________________________________________________ningún trabajo para calcular el valor de la expresión de entrada ya en su forma más simple, o 
de forma normal. Un ejemplo más complejo sería la expresión 3 +4 esta es evaluada al valor 
7.
 - 3 +4, 
it = 7: int 
Observe que la expresión al ser evaluada se termina con punto y coma. El intérprete 
permite a las expresiones pasar a través de más de una línea. Cuando esto ocurre, el prompt 
cambia a "=" por ejemplo: 
- 4 + 4 + 
= 4; 
Val it = 12: int
Definición de funciones
Una función puede definirse usando la palabra clave fun. La definición de función 
simple toma la forma:
fun <fun_name> <parameter> = <expresión>; 
Por ejemplo 
fun doble x = 2 * X; 
fun Inc X = X +1;
fun adda s ^ s = ""; 
Estas funciones pueden ser escritas como antes. Para ejecutar una función 
simplemente se da el nombre de la función seguida por el propio argumento. Por ejemplo: 
_________________________________________________________________________________
19
Paradigma de Programación Funcional 
_________________________________________________________________________________
doble 6;
 Inc 100; 
adda "tub"; 
El sistema debería darle los valores 12: int y 101: int y "la tuba": string de las 
expresiones anteriores.
Ejemplos de Programas en SML
El SML puede funcionar en modo intérprete. Esto significa que se puede ir definiendo 
funciones y utilizándolas de forma interactiva. A continuación describimos una sesión con el 
SML. Lo que aparece en negrita es lo que se supone que teclearía el usuario, el resto es lo 
que escribe el programa.
Standard ML of New Jersey, Version 110.0.7, September 28, 2000 [CM; autoload enabled]
- fun length nil = 0 | length (x :: y) = 1 + length y ;
val length = fn : 'a list -> int
- length [1,2,3] ;
val it = 3 : int
- fun append nil x = x | append (x :: y) z = x :: (append y z) ;
val append = fn : 'a list -> 'a list -> 'a list
- append [1,2,3] [4,5,6,7] ;
val it = [1,2,3,4,5,6,7] : int list
- fun map f nil = nil | map f (x :: y) = (f x) :: (map f y) ;
val map = fn : ('a -> 'b) -> 'a list -> 'b list
_________________________________________________________________________________
20
Paradigma de Programación Funcional 
_________________________________________________________________________________
- map (fn x => x * x) [1,2,3] ;
val it = [1,4,9] : int list
Cuando aplicamos una función, nos da el resultado y nos dice cual es su tipo.
_________________________________________________________________________________
21
Paradigma de Programación Funcional 
_________________________________________________________________________________
APLICACION PRÁCTICA
El siguiente ejemplo nos permite calcular el factorial de el numero entero 10.
- fun fac 0 = 1 = | fac n = n*(fac (n-1));
val fac = fn : int -> int
- fac 10;
val it = 3628800 : int
Como podemos observar, en la primera línea se define la función que realizara el 
proceso de calcular el factorial, en donde decimos que para el factorial el valor de 0 es igual 
a uno, y que el valor a calcular estará dado por la función n*(fac(n-1)).
En respuesta a esta llamada el compilador sml devuelve los tipos de valores que serán 
introducidos, y los que serán devueltos.
En nuestra tercera línea procederemos a introducir el valor a calcular con la función, 
este valor es 10; lo que nos devuelve en la cuarta línea, es el resultado de calcular el factorial 
de 10 a través de la función definida anteriormente. 
Análisis de resultado
Como podemos ver, el manejo de lenguajes funcionales nos permite de manera muy 
sencilla hacer definiciones simples, además de manejar conceptos que son muy entendibles 
y relativamente fáciles de manejar.
Este lenguaje de programación es muy apto para desarrollo de aplicaciones que 
impliquen cálculos numéricos, ya que como vemos en el ejemplo, al manejar los datos, 
podemos visualizar l tipo de datos de entrada y salida, los que permite un mejor manejo de 
los valores de entrada y salida.
_________________________________________________________________________________
22
Paradigma de Programación Funcional 
_________________________________________________________________________________
CONCLUSIONES
Del desarrollo de este proyecto de investigación hemos podido obtener las siguientes 
conclusiones:
• La gran importancia que tiene el desarrollo de programas mediante lenguajes 
funcionales debido a la cercanía con la fundamentación y definición matemática del 
mismo problema.
• Del gran campo por explorar de las aplicaciones en la ingeniería, donde se podría 
utilizar la Programación Funcional para dar soluciones más concretas, eficientes y 
eficaces.
• Lo fácil que sería demostrar que un programa es correcto, ya que la Programación 
Funcional se basa en funciones matemáticas, y si estas son correctas, el programa 
directamente es correcto.
_________________________________________________________________________________
23
Paradigma de Programación Funcional 
_________________________________________________________________________________
REFERENCIAS ELECTRONICAS
“Paradigma Funcional“ [en línea]. <http://www.monografias.com/trabajos30/paradigma-
funcional/paradigma-funcional.shtml>. [Consulta: 5 Nov. 2007].
Mark P. Jones. “Frequently Asked Questions for comp.lang.functional” [en línea]. 
<http://www.cs.nott.ac.uk/~gmh/faq.html#general-topics>. [Consulta: 10 Nov. 2007].
 “A Gentle Introduction to ML” [en línea]. <http://www.dcs.napier.ac.uk/course-
notes/sml/manual.html>. [Consulta: 16 Nov. 2007].
“Standard ML of New Jersey” [en línea]. <http://www.smlnj.org/>. [Consulta: 25 Nov. 2007]. 
 “ML” [en línea]. <http://es.wikipedia.org/wiki/Ml>. [Consulta: 13 Nov. 2007]. 
_________________________________________________________________________________
24
	INTRODUCCION
	Objetivos
	Propósito
	Delimitación de tema
	I.GENERALIDADES DEL PARADIGMA DE PROGRAMACION FUNCIONAL
	Historia y evolución de los lenguajes funcionales
	Fundamentos de los lenguajes funcionales 
	Lenguajes funcionales 
	Ventajas e inconvenientes sobre los lenguajes funcionales 
	Características de los lenguajes funcionales
	II.STANDARD ML
	CONCLUSIONES
	REFERENCIAS ELECTRONICAS

Continuar navegando

Materiales relacionados