Vous êtes sur la page 1sur 15

Cuadernos de la Facultad n.

3, 2008
La Programacin Funcional: Un Poderoso Paradigma
Gustavo Ramiro Rivadera
1
gritade r a@ uc asal.net
Resumen
El presente artculo pretende introducir al lector en el paradigma
de la programacin funcional, utilizando el lenguaje Haskell, un lenguaje
funcional puro, de propsito general, que incluye muchas de las ltimas
innovaciones en el desarrollo de los lenguajes de programacin
funcionales.
Palabras Claves: programacin funcional, paradigma funcional,
astraccin de datos, funciones de orden superior, evaluacin
perezosa, transparencia referencial, tipos de datos
1. Introduccin
Hace ya astante tiempo, cuando cursaa mis ltimos a!os en la
"niversidad, form# parte de un proyecto de investigacin en
arquitecturas de computadoras. En este proyecto analiz$amos y
clasific$amos todas los posiles tipos de arquitecturas e%istentes,
desde las comunes y uicuas &' a las lejanas (para nosotros)
supercomputadoras paralelas. En ese proyecto, a la par de descurir
que no todas las computadoras eran &', y que no todas tenan un solo
procesador y del mismo tipo, me di cuenta asimismo que los lenguajes
de programacin que utilizaan tampoco eran similares. 'laro que ya
haa aprendido el omnipresente &ascal, algo de ', '**, y la nueva ola
de los lenguajes orientados y asados en ojetos, pero lo que me llam
la atencin, no fueron las variaciones sore estos ltimos lenguajes,
+
,ngeniero en 'omputacin, desarrollador independiente de soft-are, docente de las '$tedras de
.odelos y /imulacin, 0n$lisis Estrat#gico de 1atos y 2ases de 1atos ,,,, en la 3acultad de
,ngeniera e ,nform$tica, "'0/04. 0ctualmente cursa la .aestra en ,ngeniera del /oft-are en el
,nstituto 5ecnolgico de 2uenos 0ires (,520).
67
Rivadera: La Programacin Funcional
sino otros radicalmente distintos, dise!ados muchas veces en forma
especial para m$quinas especficas. &ara comenzar, estos lenguajes no
ordenaan sus computaciones (instrucciones) en forma secuencial, sino
que el orden estaa dado por, en el caso particular de los funcionales,
la aplicacin de funciones a otras funciones, resultando por tanto,
innecesaria la e%istencia de variales. 3inalmente, este proyecto me
llev a investigar sore los diferentes paradigmas de programacin.
"n paradigma de programacin es una forma especfica de
realizar las computaciones. "n lenguaje de programacin siempre sigue
un paradigma o una mezcla de varios8 por ejemplo el paradigma
procedimental es seguido por la mayora de los lenguajes actuales,
tales como 90:0, &ascal y '**. 5ami#n podemos encontrar lenguajes
con la influencia de dos paradigmas, por ejemplo el antes mencionado
'**, que tiene su origen procedimental y al cual se le ha agregado el
paradigma orientado a ojetos.
El paradigma del que trata este artculo se denomina funcional,
programacin funcional o 3&.
2. Orgenes
4os orgenes de la programacin funcional pueden rastrearse al
matem$tico 0lonzo 'hurch, que traajaa en la "niversidad de
&rinceton, y, al igual que otros matem$ticos de all, estaa interesado
en la matem$tica astracta, particularmente en el poder computacional
de ciertas m$quinas astractas. 4as preguntas que se haca eran por
ejemplo; si dispusi#semos de m$quinas de un ilimitado poder de
cmputo, <qu# tipos de prolemas se podran solucionar=, o <se
pueden resolver todos los prolemas=
&ara contestar este tipo de preguntas, 'hurch desarroll un
lenguaje astracto, denominado '$lculo 4amda, que el cual slo
realizaa evaluacin de e%presiones usando funciones como
mecanismo de cmputo. Este lenguaje astracto no tena en cuenta
limitaciones concretas de implementacin de ningn tipo.
0l mismo tiempo que 'hurch, otro matem$tico, 0lan 5uring,
desarroll una m$quina astracta para intentar resolver el mismo
tiempo de prolemas planteados por 'hurch. 1espu#s se demostr que
amos enfoques son equivalentes.
6>
Cuadernos de la Facultad n. 3, 2008
4as primeras computadoras digitales se construyeron siguiendo un
esquema de arquitectura denominado de :on ?eumann, que es
$sicamente una implementacin de la m$quina de 5uring a una
m$quina real. Esta m$quina forz de alguna manera el lenguaje en el
cual se escrien sus programas, justamente el paradigma
procedimental, el cual, como menciona 2ackus en un muy famoso
artculo que escrii al reciir el premio 5uring en +@AB (2ackus +@AB),
tiene tantsimos defectos, que muchos programadores padecemos aun
hoy.
4a programacin funcional se aparta de esta concepcin de
m$quina, y trata de ajustarse m$s a la forma de resolver el prolema,
que a las construcciones del lenguaje necesarias para cumplir con la
ejecucin en esta m$quina. &or ejemplo, un condicionamiento de la
m$quina de :onC?eumann es la memoria, por lo cual los programas
procedimentales poseen variales. /in emargo en la programacin
funcional pura, las variales no son necesarias, ya que no se considera
a la memoria necesaria, pudi#ndose entender un programa como una
evaluacin continua de funciones sore funciones. Es decir, la
programacin funcional posee un estilo de computacin que sigue la
evaluacin de funciones matem$ticas y evita los estados intermedios y
la modificacin de datos durante la misma.
Hoy en da e%isten diversos lenguajes funcionales. /e podra
considerar como uno de los primeros lenguajes funcionales al 4,/&, que
actualmente sigue en uso, sore todo en $reas de la inteligencia
artificial. 5ami#n un pionero de este paradigma es 0&4 desarrollado en
los a!os 6D (,verson +@6E). El linaje funcional se enriqueci en los a!os
AD, con el aporte de Foin .ilner de la "niversidad de Edimurgo al
crear el lenguaje .4. Gste se sudividi posteriormente en varios
dialectos tales como Hjective 'aml y /tandard .4. 0 fines de los a!os
BD, a partir de un comit#, se cre el lenguaje Haskell, en un intento de
reunir varias ideas dispersas en los diferentes lenguajes funcionales (un
intento de estandarizar el paradigma). Este a!o .icrosoft Fesearch ha
incluido un nuevo lenguaje (funcional), denominado 3I, a su plataforma
.?E5.
4a 3igura + compara gr$ficamente amos paradigmas.
6J
Rivadera: La Programacin Funcional
.odelo imperativo (de 4ara +@@B)
.odelo 3uncional (de 4ara +@@B)
3igura +. 'omparacin entre los modelos imperativo y funcional (4ara @B).
!. "u# es la $rogramacin %uncional
En este reve artculo, intentar# e%plicar la utilidad y potencia de la
programacin funcional, por medio de peque!os ejemplos, para
comprender m$s r$pidamente esta filosofa de programacin.
1ado el nomre del paradigma, saemos $sicamente que lo
central en el mismo es la idea de funcin, que podramos decir es
an$loga a lo que conocemos de funciones de la matem$tica. &or
ejemplo, podemos escriir en el lenguaje funcional Haskell;
Factorial
factorial
factorial
:: int -> int
0 = 1
n = n * factorial (n-1)
Es decir, la ltima es una funcin sencilla, parecida a la que conocemos
de las matem$ticas de la secundaria, que permite calcular el factorial de
un nmero entero (ver definicin de la funcin factorial m$s aajo).
66
Cuadernos de la Facultad n. 3, 2008
'omparemos esa lnea de cdigo de Haskell con la siguiente en un
lenguaje como 'I;
unsigned factorial (unsigned n)
{
int product = 1;
while (n > 1)
{
product *= n--;
}
return product;
// valor inicial
// acumulador
// resultado
}
Este ejemplo es muy sencillo y los dos fragmentos de cdigo son
muy parecidos. /in emargo, la definicin de Haskell es mucho m$s
cercana a la matem$tica;
0
n
=
=
1
n * (n - 1)
4a pregunta que nos hacemos ahora, es si podemos construir
programas complejos usando simplemente funciones. Esta pregunta se
puede contestar f$cilmente si descriimos las caractersticas principales
de este tipo de lenguajes. 0 modo de ejemplo de introduccin, veamos
como se escriira el programa de ordenamiento Kuick/ort en Haskell;
En este caso, conseguimos un programa muy sencillo y corto, que
asa su potencia en la hailidad de Haskell de manipular listas (L M) y
especificar funciones recursivas. Kuicksort se define recursivamente, a
partir de la misma definicin matem$tica del algoritmo. Este algoritmo
utiliza una estrategia de divide y conquista (divide and conquer), la cual
divide a una lista en dos sulistas, la primera con elementos menores o
iguales que uno dado, denominado ivot, y la segunda con elementos
mayores. En la primera lnea del cuerpo (lnea E), se define la primera
sulista, en la segunda lnea el ivot, y la tercera lnea la tercera
sulista. El operador predefinido ** concatena dos listas. 'ada llamada
recursiva a Kuick/ort en el cuerpo especifica que se concatenar$ el
nuevo elemento (y o z) a la lista de argumento siempre y cuando se
cumpla con la condicin de m$s a la derecha (ej. y NO %).
6A
!uic"sort #$ = #$
!uic"sort (%:%s) = (!uic"sort # & ' & (- %s) & (= % $)
** #%$ **
(!uic"sort # + ' + (- %s) + > % $)
Rivadera: La Programacin Funcional
'omparemos ahora nuestro sencillo programa funcional con uno
en un lenguaje procedimental, tal como ' (Pikipedia EDDB);
6B
//Programa Quicksort en C
,oid !uic"sort(int* arra&) int left) int right)
{
if(left >= right)
return;
int inde% = partition(arra&) left) right);
!uic"sort(arra&) left) inde% - 1);
!uic"sort(arra&) inde% * 1) right);
}
int partition(int* arra&) int left) int right)
{
find-edian.f-edians(arra&) left) right);
int pi,ot/nde% = left) pi,ot0alue = arra&#pi,ot/nde%$) inde% =
left) i;
swap(1arra&#pi,ot/nde%$) 1arra&#right$);
for(i = left; i ( right; i**)
{
if(arra&#i$ ( pi,ot0alue)
{
swap(1arra&#i$) 1arra&#inde%$);
inde% *= 1;
}
}
swap(1arra&#right$) 1arra&#inde%$);
return inde%;
}
int find-edian.f-edians(int* arra&) int left) int right)
{
if(left == right)
return arra&#left$;
int i) shift = 1;
while(shift (= (right - left))
{
for(i = left; i (= right; i*=shift*2)
{
int end/nde% = (i * shift*2 - 1 ( right) 3 i * shift*2
- 1 : right;
int 4edian/nde% = find-edian/nde%(arra&) i) end/nde%)
shift);
swap(1arra&#i$) 1arra&#4edian/nde%$);
}
shift *= 2;
}
return arra&#left$;
Cuadernos de la Facultad n. 3, 2008
&. Princi$ales caractersticas
&ara demostrar las principales caractersticas de los lenguajes de
programacin funcionales modernos, vamos a utilizar el lenguaje
Haskell. Este es un lenguaje funcional puro, de propsito general, que
incluye muchas de las ltimas innovaciones en el desarrollo de los
lenguajes de programacin funcional, como son las funciones de orden
superior, evaluacin perezosa (la!" evaluation), tipos polimrficos
est$ticos, tipos definidos por el usuario, encaje por patrones (attern
matc#ing), y definiciones de listas por comprensin. 5iene adem$s otras
caractersticas interesantes como el tratamiento sistem$tico de la
sorecarga, la facilidad en la definicin de tipos astractos de datos, el
sistema de entradaQsalida puramente funcional y la posiilidad de
utilizacin de mdulos. 0unque seria imposile e%plicar con detalle cada
una de estas caractersticas en este artculo, daremos una reve
e%plicacin de alguna de ellas. El lector interesado puede recurrir a un
e%celente liro en castellano (Fuiz EDD>) y otros dos en ingl#s
(5hompson +@@@8 1oets R van Eijck EDD>) para profundizar en el tema.
6@
}
int find-edian/nde%(int* arra&) int left) int right) int shift)
{
int i) groups = (right - left)5shift * 1) " = left *
groups56*shift;
for(i = left; i (= "; i*= shift)
{
int 4in/nde% = i) 4in0alue = arra&#4in/nde%$) 7;
for(7 = i; 7 (= right; 7*=shift)
if(arra&#7$ ( 4in0alue)
{
4in/nde% = 7;
4in0alue = arra&#4in/nde%$;
}
swap(1arra&#i$) 1arra&#4in/nde%$);
}
return ";
}
,oid swap(int* a) int* 8)
{
int te4p;
te4p = *a;
*a = *8;
*8 = te4p;
}
Rivadera: La Programacin Funcional
&.1. 'i$os de datos( tu$las ) listas
4os lenguajes funcionales, en particular Haskell, tienen un rico
conjunto de datos atmicos predefinidos, tales como los num#ricos int,
integer (de mayor precisin que el anterior), $loat, dou%le, etc., y
adem$s los tipos c#ar y %ool.
El sistema de tipos de Haskell es uno de los m$s sofisticados que
e%isten. Es un sistema polimrfico, que permite una gran fle%iilidad de
programacin, pero a la vez mantiene la correctitud de los programas.
'ontrariamente a la mayora de los lenguajes de programacin
procedimentales actuales, Haskell utiliza un sistema de inferencias de
tipos, es decir sae el tipo resultante de una e%presin, por lo que las
anotaciones de tipo en un programa son opcionales.
4a parte m$s interesante de Haskell en relacin con los tipos son
los constructores, las tuplas y las listas. "na tupla es un dato
compuesto donde el tipo de cada componente puede ser distinto. "na
de las utilidades de este tipo de datos es cuando una funcin tiene que
devolver m$s de un valor;
pred9uc :: /nteger (/nteger)/nteger)
pred9uc % = (%-1)%*1)
4as listas son colecciones de cero o m$s elementos de un mismo
tipo (a diferencia de las tuplas que pueden tenerlos de diferentes). 4os
operadores utilizados son el LM y (;). El primero representa una lista
vaca, y el segundo denominado cons o constructor, permite a!adir un
elemento al principio de una lista, construyendo la lista en funcin de
agregar elementos a la misma, por ejemplo L5hompson@@M;
: : 6 : ; : #$
da lugar a la lista L>, E, 7M. /u asociatividad es hacia la derecha. "n tipo
particular de lista son las cadenas de caracteres.
&ara terminar diremos que el constructor utilizado para declarar el
tipo correspondiente a las distintas funciones es el smolo .
&.2. Patrones
'omo vimos anteriormente, una funcin puede ser definida como;
f (pat1> (pat6> < < < (patn> = (e%presi=n>
AD
Cuadernos de la Facultad n. 3, 2008
donde cada una de las e%presiones &at'( &at2( . .
representa un argumento de la funcin, al que tami#n
denominar como patrn. 'uando una funcin est$ definida
. &atn(
podemos
mediante
m$s de una ecuacin, ser$ necesario evaluar uno o m$s argumentos de
la funcin para determinar cu$l de las ecuaciones aplicar. Este proceso
se llama en castellano encaje de patrones. En los ejemplos anteriores
se utiliz el patrn m$s trivial; una sola variale. 'omo ejemplo,
consid#rese la definicin de factorial;
fact n = product #1<<n$
/i se desea evaluar la e%presin Sfact 7S es necesario hacer
coincidir la e%presin S7S con el patrn SnS y luego evaluar la e%presin
otenida a partir de Sproduct L+..nMS sustituyendo la SnS con el S7S. "na
de los usos m$s tiles es la aplicacin de los patrones a las listas. &or
ejemplo la siguiente funcin toma una
suma;
su4a :: #/nteger$ /nteger
lista de valores enteros y los
su4a #$ = 0 -- caso 8ase
-- caso recursi,o su4a (% : %s) = % * su4a %s
4as dos ecuaciones hacen que la funcin est# definida para cualquier
lista. 4a primera ser$ utilizada si la lista est$ vaca, mientras que la
segunda se usar$ en otro caso. 5enemos la siguiente reduccin
(evaluacin);
su4a #1)6);$
{ sinta%is de listas}
su4a (1 : (6: (;: #$)))
{ segunda ecuaci=n de su4a
1 * su4a (6 : (; : #$))
(% 1) %s 6 : (; : #$)) }
{ (% 6) %s ; : #$) } segunda ecuaci=n de su4a
1 * (6 * su4a (; : #$))
segunda ecuaci=n de su4a
1 * (6 * (; * su4a #$))
{ (% ;) %s #$) }
{ pri4era ecuaci=n de su4a}
1 * (6 * (; * .))
definici=n de (*) tres ,eces}
>
{
E%isten otros tipos de patrones
A+
Rivadera: La Programacin Funcional
C &atrones 0nnimos; /e representan por el car$cter (T) y encajan
con cualquier valor, pero no es posile referirse posteriormente a dicho
valor. Ejemplo;
ca8e+a (%:?) = %
cola (?:%s) = %s
C &atrones con nomre; &ara poder referirnos al valor que est$
encajando, por ejemplo, en lugar de definir $ como
f (%:%s) = %:%:%s
podra darse un nomre a x:xs mediante un patrn con nomre
f p@(%:%s) = %:p
C &atrones n)*; encajan con un valor entero mayor o igual que *.
El valor referido por la variale n es el valor encajado menos *. Ejemplo;
% A 0 = 1
% A (n*1) = % * (% A n)
En Haskell, el nomre de una variale no puede utilizarse m$s de
una vez en la parte izquierda de cada ecuacin en una definicin de
funcin. 0s, el siguiente ejemplo;
son?iguales % % = Brue
son?iguales % & = False
no ser$ aceptado por el sistema. &odra ser introducido mediante i$;
son?iguales % & = if %==& then Brue else False
&.!. Funciones de orden su$erior
4os lenguajes funcionales modernos utilizan una poderosa
herramienta de programacin; las funciones de orden superior. Haskell
en particular considera que las funciones pueden aparecer en cualquier
lugar donde aparezca un dato de otro tipo (por ejemplo permitiendo que
sean almacenadas en estructuras de datos, que sean pasadas como
argumentos de funciones y que sean devueltas como resultados). &or
ejemplo consideremos la siguiente funcin (Fuiz D>);
dos0eces :: (/nteger /nteger) /nteger
/nteger dos0eces f % = f ( f % )
Entonces al evaluar las siguientes funciones, otenemos;
AE
Cuadernos de la Facultad n. 3, 2008
-C/D> dos,eces (*6) 10
:0:: /nteger
-C/D> dos,eces inc 10
16:: /nteger
5ami#n podemos agregar a estas funciones los llamados
cominadores, que son funciones de orden superior que capturan un
esquema de cmputo. &ongamos por ejemplo el cominador iter;
/ter :: (/nteger /nteger /nteger) /nteger

(/nteger /nteger)
/ter op e = fun
where
fun 0 = e
Entonces podramos definir las funciones factorial y sumatoria
simplemente proporcionando los dos primeros argumentos en forma
correcta;
/nteger
1
factorial
factorial
:: /nteger
= iter (*)
su4atoria
su4atoria
:: /nteger
= iter (*)
/nteger
0
Hs#rvese que la estructura de amas funciones es id#ntica, salvo
el operador (U,*).
&.&. Polimor%ismo
0lgunas funciones pueden tener argumentos de m$s de un tipo de
datos, por ejemplo, la funcin identidad, que definimos en Haskell
como;
/d :: a a
donde a puede ser cualquier tipo. Entonces tenemos;
-C/D> id EdF
EdF :: char
-C/D> id true
true :: 8ool
Htro ejemplo m$s complejo es una funcin que calcule la longitud
de una lista:
A7
Rivadera: La Programacin Funcional
long ls = /F ,acia(G) then 0
else 1 * long(cola(G))
El sistema de inferencia de tipos infiere el tipo long::+,- .( /nteger,
indicando que tiene como argumento una lista de elementos de un tipo
a cualquiera y que devuelve un entero. En un lenguaje sin polimorfismo
sera necesario definir una funcin long para cada tipo de lista que se
necesitase. El polimorfismo permite una mayor reutilizacin de cdigo
ya que no es necesario repetir porciones de cdigo para estructuras
similares.
Htro ejemplo, esta vez de una funcin est$ndar, definida en el
&FE4"1E
E
, es la funcin ma, que aplica una funcin a todos los
elementos de una lista, devolviendo una lista con los resultados;
4ap :: (a 8) #a$ l8$
4apf #$
4ap f (%
= #$
: %s) = f % : 4ap f %s
HIJGKLJ>
HIJGKLJ>
HIJGKLJ>
4ap
4ap
4ap
(i 6) #1)6);$ #1):)M$ :: #/nteger$
toKpper NpepeN NHJHJN :: 9tring
ord NpepeN #116)101)116)101$ :: #/nt$
&.*. Programacin con evaluacin $ere+osa
El m#todo de evaluacin (la forma en que se calculan las
e%presiones) se llama evaluacin perezosa (la!" evaluation). 'on la
evaluacin perezosa se calcula una e%presin (parcial) solamente si
realmente se necesita el valor para calcular el resultado. El opuesto es
la evaluacin voraz (eager evaluation). 'on la evaluacin voraz se
calcula directamente el resultado de la funcin, si se conoce el
par$metro actual.
1ada la evaluacin perezosa del lenguaje es posile tener listas
infinitas. En lenguajes que usan evaluacin voraz (como los lenguajes
imperativos), esto no es posile.
El siguiente ejemplo, tomado de 3okker (@J), muestra la potencia
de este concepto. /upongamos la siguiente funcin, para saer si un
nmero es primo;
E
El &FE4"1E es el modulo principal del lenguaje, que contiene todas las funciones y operadores
predefinidos, y el nico que se carga por defecto cuando se ingresa al interprete.
A>
Cuadernos de la Facultad n. 3, 2008
pri4o :: /nt Oool
pri4o % = di,isores % == #1)%$
Esta funcin es totalmente perezosa. &or ejemplo, si evaluamos
rimo 30 pasa lo siguiente; &rimero se calcula el primer divisor de 7D; +.
/e compara este valor con el primer elemento de la lista L+,7DM. &ara el
primer elemento las listas son iguales.
1espu#s se calcula el segundo divisor de 7D; E. /e compara el
resultado con el segundo valor de L+,7DM; los segundos elementos no
son iguales. El operador OO VsaeW que las dos listas nunca pueden ser
iguales si e%iste un elemento que difiere. &or eso se puede devolver
directamente el valor $alse, y as los otros divisores de 7D no se
calculan.
&.,. Listas $or com$rensin
4a notacin de listas por comprensin permite declarar de forma
concisa una gran cantidad de iteraciones sore listas. Esta notacin
est$ adaptada de la teora de conjuntos de XermeloC3raenkel. /in
emargo en Haskell se traaja con listas, no con conjuntos. El formato
$sico de la definicin de una lista por comprensin es;
# (e%pr> ' (cualif?1>) (cualif?6> < < < (cualif?n> $
donde cada <cualif_i> es un cualificador. E%isten dos tipos;
C Yeneradores; "n cualificador de la forma at&.e, es utilizado
para e%traer cada elemento que encaje con el patrn at de la lista e,
en el orden en que aparecen los elementos de la lista. "n ejemplo
simple sera la e%presin;
3 #%*% ' % (- #1<<10$$
#1) :) M) 1>) 62) ;>) :M) >:) P1) 100$
C 3iltros; "na e%presin de valor ooleano, el significado de una
lista por comprensin con un nico filtro podra definirse como;
#e 'condici=n $ = if condici=n then #e$ else #$
*. Conclusin
0 mi parecer, la programacin funcional es un paradigma de
programacin muy poderoso, que nos permite pensar de una forma
completamente diferente cuando tenemos que resolver un prolema,
AJ
Rivadera: La Programacin Funcional
m$s parecido a la lgica y matem$tica de alto nivel, que a las
astracciones artificiales de la m$quina de :on ?eumann. 1igo que se
deera ense!ar en los primeros a!os de las universidades, y que nos
are definitivamente un camino para mejorar la ,ngeniera del /oft-are,
ya que sus programas carecen de efectos colaterales, y otros
desafortunados productos de la arquitectura tradicional de las
computadoras, siendo sencillamente evaluaciones. /in emargo, queda
mucho todava por recorrer para que este tipo de lenguajes sea de
utilizacin en proyectos cotidianos, pero creo que un primer paso es la
ense!anza de este paradigma. Hay e%periencias variadas en este
sentido, inclusive algunas en nuestro pas (/zpiniak +@@B), y en los
$mitos acad#micos de otros pases ('hakravarty EDD>, 5hompson
+@@A, 31&E EDDB), por lo que creo vale la pena su promocin.
-ibliogra%a
2ackus, 9. 'an programming e lierated from the von ?eumann style=
0 functional style and its algera of programs, Communications o$
t#e 0C1, 0ugust +@AB, :ol E+ (B)
'hakravarty, .. .. and Zeller, Y., 5he risks and enefits of teaching
purely functional programming in first year. 2ournal o$ Functional
Programming +>, + (9an. EDD>), ++7C+E7
1oets, Z. y van Eijck, 9. 3#e 4as*ell Road to Logic, 1at# and
Programming, Zing[s 'ollege &ulications, 4ondres, EDD>.
31&E DB; &roceedings of the EDDB international -orkshop on 3unctional
and declarative programming in education, 0'., ?e- \ork, "/0,
EDDB.
3okker, 9. Functional Programming, 1epartment of 'omputer /cience,
"trecht "niversity, +@@J
,verson, Z. 0 Programming language, 9ohn Piley and /ons, ?e- \ork,
+@6E
4ara Y., 9. /ntroduccin al Lengua5e 4as*ell, "niversidad de Hviedo,
1epartamento de ,nform$tica, +@@B
Fuiz, 2., Yuti#rrez, 3., Yuerrero, &. y Yallardo, 9.E. Ra!onando con
4as*ell, 6n curso so%re rogramacin $uncional, 5hompsonC
&araninfo, .adrid, EDD>
A6
Cuadernos de la Facultad n. 3, 2008
/zpiniak, 0. 3., 4una, '. 1., and .edel, F. H. Hur e%periences teaching
functional programming at "niversity of Fo 'uarto (0rgentina).
7/8C79 :ulletin, 7D(E) (9un. +@@B), EBC7D
5hompson, /. Phere 1o , 2egin= 0 &rolem /olving 0pproach in
teaching 3unctional &rogramming. ,n H. Ylaser, &. H. Hartel, and
H. Zuchen, Eds., Proceedings o$ t#e ;t# /nternational 7"mosium
on Programming Languages: /mlementations, Logics, and
Programs: 7ecial 3rac* on <eclarative Programming Languages
in 9ducation (/eptemer 7CJ, +@@A). 4ecture ?otes in 'omputer
/cience, vol. +E@E. /pringerC:erlag, 4ondon, 7E7C77>
5hompson, /. 4as*ell: 3#e Cra$t o$ Functional Programming, 0ddisonC
Pesley, 2oston, .0, +@@@
Pikipedia contriutors, SKuicksort,S =i*iedia, 3#e Free 9nc"cloedia,
http;QQen.-ik ipedia.orgQ-Qinde%.php=titleOKuicksortRoldidOEJDBJD>
>J (consultada E> ?oviemre EDDB).
AA

Vous aimerez peut-être aussi