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 al programador 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 de funciones 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 otras funciones 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 <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]. . [Consulta: 5 Nov. 2007].
Mark P. Jones. “Frequently Asked Questions for comp.lang.functional” [en línea]. . [Consulta: 10 Nov. 2007].
“A
Gentle
Introduction
to
ML”
[en
línea].
notes/sml/manual.html>. [Consulta: 16 Nov. 2007].
“Standard ML of New Jersey” [en línea]. . [Consulta: 25 Nov. 2007]. “ML” [en línea]. . [Consulta: 13 Nov. 2007].
_________________________________________________________________________________ 24