Está en la página 1de 35

Lenguajes de Programaci on Programaci on funcional

Roberto Bonvallet
Departamento de Inform atica Universidad T ecnica Federico Santa Mar a

Concepto de funci on

En el paradigma imperativo:
Una funci on es una secuencia de instrucciones El valor de retorno se obtiene a trav es de una serie de manipulaciones de estado Existencia de estado implica posibles efectos laterales Consecuencia de la arquitectura de von Neumann

Concepto de funci on

En matem aticas:
Una funci on es un mapeo de los elementos de un conjunto a los de otro: f : A B Generalmente descrita por una expresi on o una tabla de valores Evaluaci on controlada por recursi on y expresiones condicionales Libre de efectos laterales

Inuencia del paradigma imperativo en la programaci on

Lenguajes imperativos est an dise nados para explotar la arquitectura del computador Apego a la arquitectura es una restricci on innecesaria al proceso de desarrollo de software Lenguajes dise nados seg un otros paradigmas son impopulares debido a penalizaciones de rendimiento M aquina de Turing: modelo matem atico para estudiar capacidades y limitaciones del computador

Fundamentos de los lenguajes funcionales

Objetivo: emular las funciones matem aticas lo m as posible. No se usa variables ni asignaciones. Repetici on a trav es de recursi on. Transparencia referencial. Funciones son objetos de primera clase. Un programa consiste de deniciones de funciones y aplicaciones de ellas.

Funciones
Funciones simples
Ejemplo: cubo(x ) x x x x representa cualquier valor del dominio, pero est a jo en un elemento espec co durante la evaluaci on Durante la evaluaci on, cada aparici on de un par ametro est a ligada a un valor y es considerada constante Notaci on lambda para funciones an onimas: (x ) x x x Evaluaci on de una funci on an onima: (x ) x x x (2) = 8

Funciones

Formas funcionales (funciones de mayor orden)


Reciben funciones como par ametros, o entregan funciones como resultado. Por ejemplo: composici on f g (x ) = f g (x ) construcci on g , h, i (x ) = g (x ), h(x ), i (x ) aplicar a todo j , (x , y , z ) = j (x ), j (y ), j (z )

Comparaci on entre un programa imperativo y uno funcional


Problema sencillo: aplicar dos funciones a una lista de valores Programa imperativo: target [] for i in source do t1 g (i ) t2 f (t1 ) target.append(t2 ) end for Distintas versiones funcionales del mismo programa: target (f g , source) target (x ) f g (x ) , source target f g (i ) i source

Introducci on a Scheme

Caracter sticas:
dialecto de LISP sintaxis y sem antica simples nombres tienen ambito est atico no es puramente funcional

Funcionamiento del int erprete de Scheme

Entorno interactivo implementa un ciclo lectura-evaluaci on-escritura Se puede cargar las expresiones desde un archivo para facilitar el desarrollo. Las llamadas a funciones se eval uan as :
1. se eval ua los par ametros; 2. se aplica la funci on sobre los par ametros.

Funcionamiento del int erprete de Scheme

Ejemplo de sesi on interactiva


12 > 12 (1 2 3 4) > (1 2 3 4) (+ 1 2 3 ) > 6 ( s t r i n g a p p e n d h o l a mundo ) > h o l a mundo

Sintaxis del lenguaje

Scheme utiliza la misma sintaxis para: 1. listas: (1 2 3 4 5) 2. llamadas a funci on: ( max 43 23 15 58 2 1 ) 3. formas sint acticas: ( i f ( < x 0 ) x ( x ) )

Constantes literales
Valores literales pueden ser:
n umeros enteros, reales, racionales y complejos: 123456789 3.14159 22/7 +27.0 3.0 i 5 . 0 @3 . 0 strings: Hola mundo caracteres: #\a #\ s p a c e booleanos: #t #f

Listas

Notaci on de listas: (a b c d) Los elementos pueden ser de cualquier tipo: ( 1 . 0 Hola mundo 3 ) Las listas se pueden anidar: (a (b c ) (d e ( f ) g )) Las listas se tratan como objetos inmutables

Representaci on interna de las listas

implementadas como listas enlazadas los nodos se llaman pares o celdas cons el nal de una lista se marca con la lista vac a

Figura: Representaci on de (1 2 3 4 5)

Representaci on interna de las listas

implementadas como listas enlazadas los nodos se llaman pares o celdas cons el nal de una lista se marca con la lista vac a

Figura: Representaci on de (1 (2) (3 (4 5 6) (7)) ((8)))

Celdas cons

Las celdas cons son el tipo de datos estructurado fundamental de Scheme. El campo izquierdo de una celda se denomina el car, y el campo derecho, el cdr. En una lista enlazada propia, las celdas tienen:
un valor en el car; una referencia a una lista en el cdr.

Celdas cons

Las funciones car y cdr obtienen el car y el cdr de una celda. La funci on cons permite crear una celda cons deniendo su car y su cdr, y por lo tanto se puede usar para crear listas enlazadas. ( car (1 > 1 ( cdr (1 > (2 3 ( cons a > (a b 2 3 4 5)) 2 3 4 5)) 4 5) ( b c d )) c d)

Listas impropias

Una lista es impropia cuando el cdr de su u ltima celda no es la lista vac a. Las listas impropias se representan usando la notaci on de par con punto.

Figura: Representaci on de (1 2 3 4 . 5)

Listas impropias

Una lista es impropia cuando el cdr de su u ltima celda no es la lista vac a. Las listas impropias se representan usando la notaci on de par con punto.

Figura: Representaci on de ((2 (3 . 4) 5) . 1)

Listas impropias

Una lista es impropia cuando el cdr de su u ltima celda no es la lista vac a. Las listas impropias se representan usando la notaci on de par con punto.

Figura: Representaci on de (((() . 3) . 2) . 1)

Llamadas a funciones

Llamadas a funciones utilizan la misma notaci on que las listas: ( funcion arg1 arg2 . . . argN ) Para evitar que una lista sea evaluada como funci on, se utiliza el operador de citado: (a b c d) error : a no e s una f u n c i o n ( quote ( a b c d )) > (a b c d) ( a b c d) > (a b c d)

Funciones aritm eticas


Scheme provee las funciones aritm eticas elementales +, , y /: (+ 2 3) > 1 ( 1 2 3 4 5) > 120 (+ ( 3 3 ) ( 4 4 ) ) > 25 ( ( / 81 9 ) ( ) (+)) > 8 Notaci on preja evita ambig uedad en la evaluaci on.

Funciones an onimas

La forma sint actica lambda permite denir funciones an onimas. Sintaxis: ( lambda ( a r g 1 a r g 2 . . . ) e x p r 1 e x p r 2 . . . ) Ejemplo: ( lambda ( x y ) (+ ( x x ) ( y y ) ) ) ># <p r o c e d u r e > ( ( lambda ( x y ) (+ ( x x ) ( y y ) ) ) 3 4 ) > 25

Sintaxis alternativas de lambda

Guarda en args la lista de todos los argumentos: ( lambda a r g s e x p r 1 e x p r 2 . . . ) Guarda en rest todos los argumentos adicionales: ( lambda ( a r g 1 . . . a r g N . r e s t ) e x p r 1 e x p r 2 . . . )

Ligados locales
La forma sint actica let establece ligados de nombres locales. Nombres ligados con let son visibles s olo en el cuerpo del let . Sintaxis: ( let (( var1 val1) ( var2 val2) . . . ) expr1 expr2 . . . ) Ejemplo: ( l e t ( ( a 17) ( b 31)) (+ ( 1/2 a b ) ( 1/3 a b ) ) ) > 439.166666666667 ( ( lambda ( x y ) ( l e t ( ( x squared ( x x ) ) ( y squared ( y y ) ) ) ( s q r t (+ x squared y squared ) ) ) ) 5 12) > 13.0

Deniciones de nivel superior

La forma sint actica dene liga un nombre a una expresi on. Sintaxis: ( d e f i n e nombre e x p r ) Ejemplo: ( d e f i n e n 25) ( d e f i n e s q u a r e ( lambda ( x ) ( x x ) ) ) ( square n) > 625

Expresiones condicionales simples


La forma sint actica if permite evaluar una expresi on de manera condicional. Sintaxis: ( i f condicion consecuencia al t e r na t iv a ) Ejemplo: ( define signo ( lambda ( x ) ( i f (>= x 0 ) p o s i t i v o n e g a t i v o ) ) ) ( s i g n o 2) > negativo ( s i g n o 5) > positivo

Expresiones condicionales m ultiples

La forma sint actica cond permite evaluar una expresi on usando distintos casos. Sintaxis: ( cond c l a u s u l a 1 c l a u s u l a 2 . . . ) Cada cl ausula tiene alguna de estas formas:
1. (condicion) 2. (condicion expr 1 expr2 ...) 3. (condicion => expr)

La u ltima cl ausula puede tener la forma:


4. ( else expr 1 expr2 ...)

Ejemplo de uso de cond

( d e f i n e income tax ( lambda ( income ) ( cond ((<= income 1 0 0 0 0 ) ( income . 0 5 ) ) ((<= income 2 0 0 0 0 ) (+ ( ( income 1 0 0 0 0 ) . 0 8 ) 5 0 0 . 0 0 ) ) ((<= income 3 0 0 0 0 ) (+ ( ( income 2 0 0 0 0 ) . 1 3 ) 1 3 0 0 . 0 0 ) ) ( else (+ ( ( income 3 0 0 0 0 ) . 2 1 ) 2 6 0 0 . 0 0 ) ) )))

Evaluaci on de valores de verdad

Todos los objetos son considerados verdaderos, excepto #f. Existen las formas sint acticas and, or y not. and y or hacen cortocircuito. En general, los predicados l ogicos tienen nombres terminados en ?.

Ejemplos de valores de verdad


( i f 1 true fals e ) > true ( i f () true fals e ) > true ( i f #f t r u e f a l s e ) > false ( not #t ) > #f ( not f a l s e ) > #f ( or ) > #f ( or #f #t ) > #t ( or #f a #t ) > a

Ejemplos de predicados l ogicos


(< 1 2 3 4 5 ) > #t ( null ? ()) > #t ( null ? (1 2 3)) > #f ( p a i r ? (8 . 2)) > #t ( eqv ? 3 2 ) > #f ( number ? 1 5 ) > #t ( l i s t ? Veamos s i s o y una l i s t a . . . ) > #f

Recursi on simple
En Scheme, la iteraci on se hace usando recursi on. La recursi on es m as general que construcciones tipo for o while, y elimina la necesidad de usar variables de control. Una funci on recursiva debe tener:
1. un caso base, y 2. un paso de recursi on.

Ejemplo: ( d e f i n e length ( lambda ( l s ) ( i f ( null ? ls ) 0 (+ 1 ( l e n g t h ( c d r l s ) ) ) ) ) ) ( length ( ) ) > 0 ( length ( a b c ) ) > 3

También podría gustarte