Sei sulla pagina 1di 15

Tema 3: Caractersticas de la programacin

funcional
Sesin 5: El paradigma funcional (1)

martes 22 de febrero de 2011


Referencias

Captulo 1.1.5 SICP: [[http://mitpress.mit.edu/sicp/full-text/book/book-Z-


H-10.html#%_sec_1.1.5][The Substitution Model for Procedure Application]]

Captulo 10 PLP: Functional Languages

martes 22 de febrero de 2011


Hoy veremos

Historia del paradigma funcional

Caractersticas del paradigma funcional puro

Modelo de computacin basado en sustitucin

martes 22 de febrero de 2011


Orgenes histricos

Races tericas, antes de aparecer los ordenadores

1930s: Alan Turing, Alonzo Church, Stephen Kleene, Emil Post, etc.

Turing: Mquina de Turing, programacin imperativa

Kleene y Post: mtodos abstractos, sustituciones algebraicas

Church: Clculo lambda, programacin funcional

Modelo de clculo lambda basado en la definicin de funciones y la


aplicacin de estas funciones a argumentos

martes 22 de febrero de 2011


Conceptos de la programacin funcional
En un sentido estricto, la programacin funcional define un programa como
una funcin matemtica que convierte unas entradas en unas salidas, sin estado
interno ni efectos laterales

Lenguajes funcionales puros: Miranda, Haskell, pH, Sisal, ML...

(1958, John MacCarthy). LISP es el primer lenguaje de alto nivel basado en el


paradigma funcional

LISP no es programacin funcional pura, tienen algunas instrucciones


imperativas que permiten estado local y efectos laterales

LISP lenguaje revolucionario, introduce nuevos conceptos: funciones como


objetos primitivos, funciones orden superior, polimorfismo, listas, recursin,
smbolos, homogeneidad de datos y programas, bucle read-eval-print

martes 22 de febrero de 2011


Caractersticas de la programacin funcional

Programacin declarativa:

no hay asignacin ni cambio de estado

no hay referencias: identificadores asociados a valores

no hay efectos laterales

Recursin

Funciones como tipos de datos primitivos

martes 22 de febrero de 2011


Programacin declarativa vs imperativa

Programacin imperativa: pasos de ejecucin y estado de variables

int x = x + 1; (define (cuadrado x)


int y = y + 3; (* x x))

Ejemplo de estado local (no existe en programacin declarativa):

int function contador ()


{
static int c = 0;

c++;
return c;
}

contador(): 1
contador(): 2
contador(): 3

martes 22 de febrero de 2011


Programacin declarativa vs imperativa

Programacin declarativa: Dentro del mbito de declaracin de las variables


x1 xn todas las ocurrencias de una expresin e que contiene nicamente
las variables x1 xn tienen el mismo valor.

Consecuencia: optimizacin. Si una expresin e aparece en varios lugares


dentro de un mismo mbito, slo es necesario evaluarla una vez.

(define (f x)
(define (f x)
...)
...)
(define y (f 2))
(+ (f 2) (f 2))
(+ y y)

Una funcin llamada con los mismos argumentos siempre


devuelve el mismo resultado

martes 22 de febrero de 2011


Modelo de computacin de sustitucin

Un modelo computacional es un formalismo (conjunto de reglas) que definen


el funcionamiento de un programa.

En los lenguajes funcionales basados en la evaluacin de expresiones, el


modelo computacional define cul va a ser el resultado de evaluar una
determinada expresin.

El modelo de sustitucin se basa en una versin simplificada de la regla de


reduccin del clculo lambda.

martes 22 de febrero de 2011


Modelo de computacin de sustitucin

Reglas para evaluar una expresin e de Scheme:

Si e es un valor primitivo, devolver ese mismo valor.

Si e es una variable, devolver su valor asociado.

Si e es una expresin del tipo (f arg1 argn), donde f el nombre de un procedimiento primitivo (+, -, ),
evaluar arg1 argn y aplicar el procedimiento al resultado.

Si e es una expresin del tipo (f arg1 argn), donde f es el nombre de un procedimiento compuesto
(definido con un define), sustituir f por su cuerpo, reemplazando cada parmetro formal del procedimiento
por el correspondiente argumento evaluado. Evaluar la expresin resultante.

martes 22 de febrero de 2011


Ejemplo modelo de sustitucin

(define (double x) (+ x x))


(define (square y) (* y y))
(define (f z) (+ square (double z)) 1))

Evaluamos (f (+ 2 1)) con orden aplicativo

martes 22 de febrero de 2011


Orden normal vs orden aplicativo

Orden aplicativo (Scheme): se evalan primero los argumentos, luego se


sustituye

Orden normal: se realizan todas las sustituciones hasta que se tiene una larga
expresin formada por expresiones primitivas; se evala entonces

Evaluamos (f (+ 2 1)) con orden normal

En programacin funcional el orden normal y el orden aplicativo


siempre devolvern el mismo resultado

martes 22 de febrero de 2011


Orden normal vs orden aplicativo

El orden importa si no tenemos programacin funcional pura:

(define (zero x) (- x x))


(zero (random 10))

martes 22 de febrero de 2011


Simulacin en Scheme

(load "simply.scm")
(load "order.scm")
(def (doble x) (+ x x))
(def (cuadrado x) (* x x))
(def (f z) (+ (cuadrado (doble z)) 1))
(applic (f (+ 2 1)))
(normal (f (+ 2 1)))

martes 22 de febrero de 2011


Ejercicios

Dada la funcin:
(define (double x)
(+ x x))

Evaluar la expresin (double (* 3 4)) en orden aplicativo y en orden


normal. Cul es ms eficiente?

Dada la funcin: (define (switch x a b c)


(cond ((< x 0) a)
((= x 0) b)
((> x 0) c))))

Evaluar la expresin (switch -1 (+ 1 2) (+ 2 3) (+ 3 4)) en orden


aplicativo y en orden normal. Cul es ms eficiente?

martes 22 de febrero de 2011

Potrebbero piacerti anche