Вы находитесь на странице: 1из 24

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 <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

Вам также может понравиться