Académique Documents
Professionnel Documents
Culture Documents
Características
En ciencias de la computación, la programación funcional es un paradigma de
programación declarativa basado en la utilización de funciones aritméticas que no
maneja datos mutables o de estado. Enfatiza la aplicación de funciones, en
contraste con el estilo de programación imperativa, que enfatiza los cambios de
estado. La programación funcional tiene sus raíces en el cálculo lambda, un sistema
formal desarrollado en los años 1930 para investigar la definición de función, la
aplicación de las funciones y la recursión. Muchos lenguajes de programación
funcionales pueden ser vistos como elaboraciones del cálculo lambda.
El cálculo lambda.
El cálculo lambda proporciona una notación muy simple (pero bastante críptica al
mismo tiempo) de definición de funciones matemáticas. Sólo son necesarias tres
reglas sintácticas para definir las expresiones del cálculo lambda
Lenguaje
El lenguaje LISP
Introducción
Introducción
z Uso habitual en Inteligencia Artificial z LISt Processing z Características básicas »
Lenguaje Interpretado – También posible compilado » Todas las variables son
punteros » Liberación automática de memoria (automatic garbage collection) Efi i i l
j» Eficiencia menor que otros lenguajes (causas: es interpretado, liberación
automática de memoria, ...). » Adecuado para prototipados y cálculo » Adecuado
para prototipados y cálculo simbólico. z Nuevo paradigma de programación:
programación funcional
programación funcional
Datos
Evaluación
Notación prefijo. El primer elemento de una lista indica qué se desea hacer
6
Operadores de manipulación de listas, I
– (setf (rest dias) ‘(viernes domingo)) Atención! Lista modificada! – dias >>> (LUNES
VIERNES DOMINGO) – (setf (rest dias) dias) >>> (LUNES LUNES ....) z ¡Cuidado!,
listas circulares
(setf [<var1> <valor1>] ... [<varn> <valorn>]) Sirve para: • Asignar valores a
variables
» list
9
Operadores de manipulación de listas, IV
z CONS » (cons <expresion> <lista>) » Crea una lista cuyo primer elemento es »
Crea una lista cuyo primer elemento es <expresion> y cuyo resto es <lista> – (cons
‘(a b) ‘(c d e)) >>> ((A B) C D E) (cons ‘a (cons ‘b nil)) : construir una lista, t d l t li t í
z APPEND » (append <lista>*) » (append ‘(a b) ‘(c d)) >>> (A B C D) ( d '( b) '( (d)) '(
f)) (A B C (D) E F) concatenando elementos a una lista vacía » (append '(a b) '(c (d))
'(e f)) >>> (A B C (D) E F) » No destructivo. Crea copia (a primer nivel) de todos los
argumentos menos el último » (append ‘a ‘b ‘c) >>> ? ERROR z LIST » (list
<expresion>*) » (list ‘(a b) ‘(c d)) >>> ((A B) (C D))
» (list '(a b) '(c (d)) '(e f)) >>> ((A B) (C (D)) (E F)) » (list ‘a ‘b ‘c) >>> ? (A B C)
10
– POP. Macro z (pop c) >>> E Introduce elemento. Modifica la lista z c >>> (F) Saca
elemento. Modifica la lista
10
11
z Otras funciones: – LAST z (last <lista>) z (last <lista>) z (last ‘(a b c)) >>> (C) z
(last ‘((A B) (C D))) >>> ((C D)) Devuelve el último elemento – REVERSE z (reverse
<lista>) z (reverse ‘(a b c)) >>> (C B A) z (reverse '((A B) (C D))) >>> ((C D) (A B))
(del primer nivel de anidamiento) (reverse ((A B) (C D))) ((C D) (A B))
– SUBST z (subst <nuevo> <viejo> <lista>) Longitud de la lista, del primer nivel
11
12
13
13
14
z EVAL (en desuso) » Evalúa dos veces una expresión » (eval ‘(+ 3 4)) >> 7 » (eval
(+ 3 4)) >> 7 » (setf a 'b) » (setf b ‘c) » a >> b » b >> c » (eval a) >> c z Operadores
matemáticos p » +, -, *, /, ABS » EXPT – (expt 2 4) >>> 16 MAX MIN» MAX, MIN –
(max 2 3 4 5) >>> 5 » FLOAT – (float 1/2) >>> 0.5
14
15
Condicionales, I
z El valor lógico de una forma LISP se considera “falso” si su valor LISP es NIL En
caso contrario el valor lógico NIL. En caso contrario, el valor lógico es “verdadero”.
Condicionales: * if * when z IF (macro) » Sintaxis: – (if <expresion> <forma1>
[forma2]) * unless *cond – Si el valor lógico de <expresión> es “verdadero”,
devuelve el valor de <forma1>. Si es “falso”, devuelve el valor de <forma2>. » (if (> 5
(+ 2 2)) (+ 3 3) (+ 3 4)) >>> 6
15
Si se desea que se evalúen varias formas cuando sea cierta o falsa la condición,
qué hacemos?
16
Condicionales, II
16
17
Condicionales, III
17
18
Condicionales, IV
18
(t (+ 7 8) (+ 8 9))) >>> 13
19
Predicados
19
» NULL – ¿Es la lista vacía? .¿Es su valor lógico “falso”? – (null (rest ‘(a))) >>> T
Hoja 1, ejercicio 5
20
Predicados de igualdad, I
20
1) (eql (cons ‘a nil) (cons ‘a nil)) >>> NIL (falla i) 2) (setf x (cons ‘a nil)) >>> (A) (eql x
x) >>> T
21
Predicados de igualdad, II
22
Operadores lógicos, I
22
23
Operadores lógicos, II
Hoja 1, ejercicio 6
23
24
z (setf dias ‘(lunes martes miercoles)) » Es una variable global (puede ser llamada
por el resto de instrucciones) por el resto de instrucciones) z Las variables globales
en LISP se suelen denominar con “*”: *di d l *» *dias-de-la-semana*
24
25
z Variables locales » LET (macro) Ejemplo:– Ejemplo: >(prog1 (let ((x ‘a) (y ‘b) z)
(setf z (list x y)) (list z z)) (list 'final 'evaluacion)) >>> ((A B) (A B)) Sintaxis:–
Sintaxis: (let ((<var-1> <valor-inicial-1>) (<var-2> <valor-inicial-2>) ... (<var-n>
<valor-inicial-n>)) <forma-1> <forma-2>
25
26
Definición de funciones, I
26
27
Definición de funciones, II
27
28
z Un mismo símbolo se puede utilizar para definir una variable y una función. ( tf f ‘
)» (setf f ‘a) » (defun f (x y) (list x y)) z LISP permite referirse a las funciones o bi b bi
l bien por su nombre o bien por la expresión que las define (caso lambda) z LISP
manipula las funciones como un tipo más de datos. » Las funciones pueden recibir
funciones como argumento » Las funciones pueden devolver como valor de retorno
funciones.
28
29
Definición de funciones, IV
29
30
Definición de funciones, V
z Ejercicios de iteración >> (dotimes (i 3 (list 'final)) (print i)) 0 0 1 2 (FINAL) » Cómo
sería con while?: (progn (let ((i 0)) (while (< i 3) (while (< i 3) (print i) (setf i (+ i 1)))
(list 'final)))
» Cómo sería con loop? (progn (let ((i 0)) (loop (print i) (setf i (+ i 1))
30
31
Definición de funciones, VI
31
que contar
32
Lfdót
32
La forma de cómo se presentan los datos sobre los que se aplica la función, con
apply los datos van dentro de ( y )
33
z REMOVE
Hace lo común
33
Hoja 1, ejercicio 9
34
34
>>> ((A B) C)
35
35
36
36
37
Arrays
z Colección n dimensional de elementos. Se puede recorrer con un índice. A i l l tz
Acceso no secuencial a elementos » En listas, el acceso a los elementos es
secuencial Má fi i t l l t» Más eficiente el acceso a elementos en arrays que en listas
z Operadores: MAKE-ARRAY, AREF > ( tf i (k '(2 3)))» > (setf mi-array (make-array
'(2 3))) >>> #2A((NIL NIL NIL) (NIL NIL NIL)) » > (setf (aref mi-array 0 1) 'a) >>> A »
> mi-array >>> #2A((NIL A NIL) (NIL NIL NIL))
Crear array: (k li di i )
37
38
Estructuras, I
make-nombreestructura :
38
39
Estructuras, II
39
<nomcomponentei><valori> …))
40
Alternativa a estructuras
z Las listas son una alternativa al uso de estructuras: > ( tf 1 '(( NOMBRE JUAN) >
(setf persona1 '((:NOMBRE JUAN) (:ALIAS JUANITO) (:APELLIDO NIL))) ((
NOMBRE JUAN)>>> ((:NOMBRE JUAN) (:ALIAS JUANITO) (:APELLIDO NIL)) ( li
1)> (assoc :alias persona1) >>> (:ALIAS JUANITO) > (first ( b li 1 (member :alias
persona1 :test #'(lambda (x y) (eql x (first y)))))
40
41
DEBUGGING
z TRACE » Función recursiva: (defun factorial (n)– (defun factorial (n) (if (= n 0) 1 (*
n (factorial (- n 1))))) » (trace factorial) > (factorial 2) () FACTORIAL [call 5 depth 1]
with arg: 2 FACTORIAL [call 6 depth 2] with arg: 1 FACTORIAL [call 7 depth 3] with
arg: 0 FACTORIAL [ ll 7 d th 3] t l 1 FACTORIAL [call 7 depth 3] returns value: 1
FACTORIAL [call 6 depth 2] returns value: 1 FACTORIAL [call 5 depth 1] returns
value: 2 z UNTRACE z UNTRACE » (untrace), (untrace factorial) z Uso de PRINT,
DESCRIBE, etc (d ib ‘f t i l)
41
42
42
43
z Dotted-pairs (en desuso) > (cons 'a 'b) >>> (A . B) óóz Edición, carga compilación:
» COMPILE-FILE, LOAD-FILE z Entrada-salida: » PRINT, READ, FORMAT, READ-
LINE, READ-CHAR z Otros operadores de iteración: » DO, DO* (su diferencia es
equivalente a la de LET y LET*) z (declare (special <variable>)) z Argumentos
opcionales (&optional) z “Property-names” de símbolos z Copias de listas: COPY
TREE
43
*Standard ML
*Hope
*Maskell
El lenguaje funcional Hope puede considerarse como una notación para escribir
programas en forma de expresiones funcionales. Una expresión puede estar
constituida por un conjunto de símbolos básicos como; "-,+, >, (, 2", etc.
*Separadores "{;}"
• Ejemplo:
Prioridades.
2+3*5;
Tabla de Prioridades:
Asociatividad.
Shop winter
• Ejemplos:
Expresión(E): 2 + 3 * 4;
Resultado(R): 14
(E): (2 + 3) * 4;
(R): 20
(R): 69 : num
Tipos.
antes de evaluarla.
• Se asegura que los tipos de las operaciones y los operandos son los esperados al
evaluar una expresión funcional.
*Char: Caracteres imprimibles (tienen que estar encerrados entre comillas simples)
Funciones.
• Esta regla hace corresponder a todo elemento del (de los) dominio(s) origen un
elemento del dominio destino.
num → truval
indica que la función transforma un valor de tipo num (entero) en otro de tipo truval
(booleano).
*(R) 4: num.
Erlang
Es un lenguaje funcional y de programación concurrente, fue diseñado por la
compañía Ericsson con el propósito de hacer aplicaciones que puedan soportar
fallos, funcionamiento ininterrumpido, aplicaciones distribuidas, entre otras cosas.
Tiene una característica muy importante "el cambio de código en caliente" el cual se
refiere a poder modificar el código aun cuando la aplicación esta corriendo. Erlang
no seguía la filosofía de código abierto hasta 1998 cuando Ericsson lo cedió como
tal.
instrucción,
instrucción,
resultado_a_devolver
También podemos escribir alguna condición antes de ">" podemos poner que si se
cumple algo entonces se lleve acabo determinada instrucción esto lo hacemos con
"when" una forma de implementarlo seria seria:
Código:
-module(geom).
-export([circulo/1]).
-export([cuadrado/1]).
-export([rectangulo/2]).
-export([triangulo/3]).
circulo(R) ->
2*R*3.1416.
cuadrado(L) ->
L*4.
rectangulo(A,B) ->
2*A+2*B.
triangulo(A,B,C) ->
A+B+C.
Ahora que ya escribí mi programa tengo que compilar el modulo desde Erlang para
ver si no marca ningún error, la manera de hacerlo es escribimos erl en el terminal y
luego c(geom)., esta es la captura de pantalla:
Como todo esta bien en el código podemos ver "{ok, geom}", ahora si podemos
obtener el perímetro de las figuras de esta manera escribimos el
nombre_del_modulo:nombre_funcion(dato1, dato2...datox). en mi caso escribo:
y cuando escribimos más datos de entrada a alguna función de los que acepta nos
marca error por ejemplo:
Lenguaje funcional
Soporte de concurrencia
Tolerancia a fallas
El lenguaje F#
Hace dos años, tuve el gusto de dar una charla con Martín Salías, en Microsoft de
Argentina, sobre lenguajes de programación en .NET. Uno de los que presentamos
(además de Lisp, Prolog y cosas así, Martín expuso sobre LINQ que estaba
entonces apareciendo), fue el lenguaje F#.
F# site
About F# and comparison with OCaml, talks, performance and the FAQ.
The F# Downloads page contains release and download information for the
Microsoft Research implementation of F#.
Otra motivación es continuar invirtiendo en hacer del framework .NET una gran
alternativa para uso académico. Muchos departamentos de ciencia de la
computación en el mundo enseñan programación funcional. Creemos que a través
de F# y lenguajes como IronPython y IronRuby nosotros podemos ofrecer a los
estudiantes y educadores alternativas más allá de la actual corriente principal, y
habilitar el uso de estos lenguajes en la enseñanza. Esto ayuda a los educadores a
tener una opción a usar el Visual Studio como una herramienta de curso a curso.
Esperemos ver qué sucede. Es simpático el F#, aunque hay que habituarse a sus
sintaxis e ideas (siento algún escalofrío recordando mis días con el APL, A
Programming Language), pero veamos como la comunidad académica lo toma. Me
parece más difícil verlo adoptado en entornos de desarrollo, pero si prende en la
academia, seguramente podrá tener su nicho en la industria. Es interesante leer en
los comentarios del post de Somasegar, la opinión de James Plamondon: "esto es
un preludio al día en que los programadores podrán elegir el mejor lenguaje para
escribir cada parte de su tarea de codificación, así como un carpintero usa un
martillo para una y una sierra para otra".