Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Dialnet ProgramacionFuncional 4902462 PDF
Dialnet ProgramacionFuncional 4902462 PDF
PROGRAMACION
FUNCIONAL:
CONCEPTOS
y PERSPECTIVAS
Fabio Augusto Gonzle: Osorio
Instructor Asociado
Departamento de Ingeniera de Sistemas
Universidad Nacional de Colombia
fgonza@ ingenieria. ingsala. unaLedu.co.
Resumen
-~______;__;______;__;----
INGENIERA E INVESTIGACIN
La implementacin de esta funcin en un comporta asintticamente como fib (n) lo cual se
lenguaje funcional definitivamente exigira otra nota como t(n) = O(fib (n))). Una mejor opcin sera
estrategia, pues en estos lenguajes no se cuenta calcular fib (n) de manera iterativa, es decir,
con variables, ni asignaciones, ni ciclos. Por tanto, generando fib {J), fib (2), fib (3), etc, hasta llegar
se recurrir a una definicin recursiva- equivalente al fib (n) (en cada paso se utilizan los dos ltimos
def valores para generar el siguiente valor); el tiempo
O sin=O de ejecucin de este algoritmo t' (n) se comporta
f(n)= { f(n - 1)+ n en otro caso asintticamente como n (t'(n)=O(n)), es decir el
tiempo es una funcin lineal del argumento de la
Que en el lenguaje como CAML se vera de la funcin, el cual es claramente mejor que el tiempo
siguiente forma: del algoritmo recursivo.
INGENIERA E INVESTIGACIN
A. Funciones de alto orden en CAML que nos permita obtener la versin
'currificada' de una funcin con dos argumentos:
El concepto "alto orden" se refiere a funciones
que reciben como argumento o retoman funciones, let curryf= (fun x -> ([uny-> f(x,y)));;
es decir, las funciones pueden manipulase como
datos; esta caracterstica tambin es referida como Utilicemos la funcin curry aplicada sobre
"funciones como objetos de primera clase." deriva para construir una funcin g' que
corresponda a la derivada de g (x )=x"2-1:
Por ejemplo, podramos utilizar la siguiente
definicin de la derivada de una funcin! letgx =x *. x-l.O;;
let g' = (curry deriva) g ;;
f'(x)= Lim f(x+h)-f(x)
h~oo h El proceso de evaluacin de g' 3. O sera:
1IIII~~fN~G~E_~_E_Rl_'~A~E~~
__E~S~T~IG~A~C_IO~'N ___
pertenecen a este tipo. Fraccin es un constructor funciones por casos; esto le da mayor capacidad
que no se ha declarado previamente. expresiva al lenguaje permitiendo escribir el cdigo
ms claro, sencillo y conciso.
En el ltimo ejemplo se emplea el tipo lista
dentro de su propia definicin; concretamente se Un ejemplo de definicin de una funcin
dice que una lista puede ser vacia o el 'cons' de un utilizando emparejamiento de patrones es la funcin
entero con una lista ya existente; en este caso 'cons' fib recursiva del numeral 1. Otro ejemplo es la
se puede entender como la operacin de adicionar siguiente definicin de la funcin Suma que calcula
un entero la cabeza de la lista. Ejemplos de elementos el tamao de una lista de enteros segn la
del tipo lista son: definicin del tipo lista dada en el apartado B. del
numeral 11.
vaca
cons (5, vaca) let rec Suma = fun vaca -> O
cons ( 3, cons (9, cons ( 1, vaca))) I cons (cabeza, resto) -> cabeza
+ Suma (resto);;
Como puede observarse, el nmero de
elementos pertenecientes al tipo lista es infinito; Aqu estn definindose dos patrones
esto es, efecto directo del carcter recursivo de su posibles C'vacia" y "cons (cabeza, resto)") que
definicin. Precisamente esta caracterstica, la pueden tomar el argumento enviado a suma; el
recursividad es la que le da el nombre de algebraico compilador trata de emparejarlo con cada uno. En
al sistema de tipos y le permite al programador definir caso de conseguirlo, ejecuta el cdigo a
y manejar estructuras bastante complejas, sin continuacin de la flecha (- .
necesidad de manipular apuntadores; esto elimina
Por ejemplo, en caso de evaluar Suma
la gestin directa de la memoria dinmica y, por tanto
cons(5, cons(2, cons(8, vacia))) , el compilador
obvia, una gran fuente de errores.
empareja el argumento con el segundo patrn
("cons (cabeza, resto)'') haciendo cabeza=5 y
Otro ejemplo de tipo recursivo es el de rbol
resto=cons(2, cons(8, vacia)); la evaluacin de la
expresin continuara as:
type arbolbi = vado I nodo ofint*arbo1bi*arbolbi;;
Suma cons (5, cons (2, cons (8, vacia) ) )
En este caso estn representndose el tipo
=> 5 + Suma cons (2, cons (8, vacia) )
de rboles binarios con etiquetas enteras en sus
=> 5 + 2 + Suma cons (8,vacia)
nodos. El siguiente rbol:
=> 5 + 2 + 8 + Suma vacia (en este caso se empareja el
primer patrn)
1O => 5 + 2 + 8 + O
/ \
2 5 D.Inferencia de tipos
\
Tradicionalmente, los sistemas de tipos de
Se representa mediante la siguiente expresin los lenguajes de programacin se han dividido en
de tipo arbolbi: dos: estrictos y no estrictos. En el primer caso, el
programador debe declarar el tipo de cada una de
nodo (10, nodo (2, vacio, nodo (1, vacio, vacioi), las variables y de los argumentos de las funciones
nodo (5, vacio, vacio)) y procedimientos, y ceirse de manera estricta a
estas declaraciones; en el segundo caso, el
C. Emparejamiento de patrones programador no debe ceirse necesariamente a las
declaraciones' y eventualmente las puede obviar,
El emparejamiento de patrones (en ingls como cuando a una funcin declarada en C que
Pattern Matching), se refiere a la posibilidad que recibe un entero, se le enva como argumento un
brindan algunos lenguajes funcionales de definir nmero de punto flotante.
- ~:.:....:....=..~II
INGENIERA E INVESTIGACIN .
La experiencia ha demostrado que los sistemas intrprete para la funcin curry definida en el
de tipos estrictos son preferibles a los no estrictos, apartado A del numeral 11.es:
pues favorecen la depuracin sencilla del cdigo al
eliminar en tiempo de compilacin muchos errores curry :(a' *b' -> c') -> (a' -> (b' -> c'))
potenciales; sin embargo pueden resultar muy
engorrosos para el programador por su falta de el cual evidencia el alto orden de la funcin, pues
flexibilidad. sta recibe como parmetro una funcin de tipo (a'
*b' -> c') y retoma una funcin (tambin de alto
Los sistemas de inferencia de tipos orden) de tipo (a' -> (b' -> c')).
representan un punto intermedio entre los dos
esquemas mencionados anteriormente. Por un lado, PERSPECTIVAS Y CONCLUSIONES
conservan el carcter estricto del sistema de tipos y
por otro liberan al programador de declaraciones Las caractersticas que hemos ilustrado de
explcitas de los tipos de los argumentos de las hasta ahora evidencian el gran potencial de los
funciones y de sus valores de retomo. Esto puede lenguajes funcionales como herramientas que les
parecer contradictorio, pero la clave est en que el facilite a los programadores enfrentar la complejidad
compilador hace el trabajo de asignacin de tipos creciente del desarrollo de software; esto nos
por el programador y, lo que es mejor, lo hace de la permite afirmar que en los prximos aos los
manera ms general posible, es decir, evidenciando lenguajes funcionales tomarn un lugar en el rea
la genericidad y el polimorfismo cuando stos tienen de desarrollo de software a gran escala, aliado de
cabida dentro de una funcin. lenguajes tan tradicionaies como e, e++,ADA [3,4].
La afirmacin anterior se sustenta con los siguientes
Por ejemplo, al introducir la funcin Suma puntos:
definida en el apartado e del numeral Il.C, el intrprete
de eAML responde con el siguiente mensaje: Transparencia referencial. Este concepto
se refiere a la propiedad de los lenguajes
Suma: lista -> int = <fun> funcionales que hace que la misma expresin
siempre represente el mismo valor; esto
Lo cual est indicndonos que la funcin permite probar matemticamente la correccin
Suma recibe como argumento un dato del tipo lista de un programa. La posibilidad de escribir
y retoma como resultado un entero; esto es inferido programas cuya correccin es probable en
por el intrprete de manera automtica. vez de gastar el tiempo pescando errores
puede revolucionar el proceso de
En el caso de una funcin como la siguiente: produccin de software.
1I__
IN_G_EN_I_E_Rl_'A_E_IN_V_E_ST_I_G_A_C_IO_'N _
intrpretes y compiladores. Hoy da, esto no BIBLIOGRAFA
representa un problema pues los avances
investigativos han permitido la construccin
l. CURRY H., FEYS R. Combinatory Logic,- North-
de compiladores que generan cdigo nativo
Holland , 1958.
que iguala en eficiencia el cdigo generado
por compiladores convencionales (C, 2. DYBVIG K. The Scheme programming
Fortran, etctera.). language. Addisson- Wesley 1996.
Programacin funcional
7. http://cm-bell-Iabs.com/cm/cs/who/wad ler/
guide.html
8. http://www.lpac.ac.uklSEL- HPC/Articles/
FuncArchive.html
9. http://carol.fwi.uva.nl/-:jon/func.html
Lenguajes
________
INGENIERA E INVESTIGACIN 11
1