Introducción a la programación funcional

Documentos relacionados
Tema 3: Características de la programación funcional. Sesión 5: El paradigma funcional (1)

Algoritmos y programas. Algoritmos y Estructuras de Datos I

Tema 3. Patrones y Definiciones de Funciones

Tipos algebraicos y abstractos. Algoritmos y Estructuras de Datos I. Tipos algebraicos

Tema 3. Patrones y Definiciones de Funciones

Análisis de Lenguajes de Programación II El Inicio

Tema 4: Definición de funciones

Procesadores de lenguaje Tema 5 Comprobación de tipos

Tema 9: Declaraciones de tipos y clases

Tema 9: Declaraciones de tipos y clases

Tipos de datos algebraicos

Metodologías de Programación II Introducción

Programación Funcional Lisp-DrScheme Primera Parte. Dr. Oldemar Rodríguez Rojas Escuela de Informática Universidad de Nacional

Tema 7. El sistema de clases

GUÍA BÁSICA DE SCHEME v.4

Tema 6: Funciones recursivas

El sistema de clases de Haskell. Introducción

Programación funcional

Generación de Código Intermedio

Modelos de Desarrollo de Programas Y Programación Concurrente Clase N 3

La recursividad forma parte del repertorio para resolver problemas en Computación y es de los métodos más poderosos y usados.

Tipos y estructuras de datos en los lenguajes funcionales

Isabelle como un lenguaje funcional

Tema 4: Gramáticas independientes del contexto. Teoría de autómatas y lenguajes formales I

Tema 8: Tipos de datos. Sesión 24: Tipos de datos (1)

SISTEMAS INFORMÁTICOS PROGRAMACION I - Contenidos Analíticos Ing. Alejandro Guzmán M. TEMA 2. Diseño de Algoritmos

Un. VI. Generador de código intermedio.

Programación MODULAR: Subalgoritmos - funciones y procedimientos

Programación Funcional Lisp-Scheme

ANEXO XVII DE LA RESOLUCION N

Tema 3: Tipos y clases

Semántica: principales usos. Semántica: principales enfoques. Semántica Operacional. Sintaxis abstracta de un lenguaje (sujeto) Semántica Operacional

Escribir programas a partir de un diagrama de flujo

EJERCICIOS DE LENGUAJES Y PARADIGMAS DE PROGRAMACIÓN (CUESTIONES DE EXAMEN) PROGRAMACIÓN FUNCIONAL

Tema 3: Tipos y clases

Tema 2: Introducción a la programación con Haskell

Introducción a Haskell. El lenguaje Haskell

Guía práctica de estudio 05: Pseudocódigo

2007/ PROGRAMACIÓN. Tipo: TRO Curso: 1 Semestre: AB CREDITOS Totales TA TS AT AP PA OBJETIVOS. 1.-Introducción.

Definiciones de tipo. Sinónimos de tipo

Análisis de Algoritmos

INSTITUTO POLITECNICO NACIONAL SECRETARIA ACADEMICA DIRECCION DE ESTUDIOS PROFESIONALES EN INGENIERIA Y CIENCIAS FISICO MATEMATICAS

1. Computadores y programación

CONTENIDO. 1.- Introducción a la Inteligencia Artificial (IA) 2.- Lógica de predicados. 3.- Búsqueda de soluciones

Tema 3: Tipos y clases

Tema 1 Programación Funcional

TÍTULO: MATEMÁTICA DISCRETA Y LÓGICA Disponibilidad

Tema 6: Clases. Índice

Es un conjunto de palabras y símbolos que permiten al usuario generar comandos e instrucciones para que la computadora los ejecute.

Coordinación de Ciencias Computacionales INAOE. Teoría de Autómatas y Lenguajes Formales. Temario detallado para examen de ingreso 2012

Tema 5: Macros. Sesión 14: Macros

Unidad II: Análisis semántico

Lógica y Programación

Programación Declarativa UNIVERSIDAD DE MÁLAGA

PROGRAMA DE CURSO. Horas Docencia Horas de Trabajo Horas de Cátedra Docentes. Personal

Unidad 2. Introducción Lenguajes y Compiladores

El lenguaje Haskell 98

Contenido. Prefacio Orígenes de la programación orientada a objetos... 1

CARRERA DE CIECNIAS DE LA COMPUTACIÓN PROGRAMA DE ESTUDIO. Teóricos: 2 Práctico: 1 Total 3

Semántica Denotacional

Componentes Básicos. InCo. InCo Componentes Básicos 1 / 28

Programación I Recursividad.

Solución al parcial 14

Apuntes de Tipos Abstractos de Datos. Juan M. Molina Bravo

Tema 5. Análisis semántico

Tema 1. Introducción a la Programación Orientada a Objetos

Introducción. Algoritmos y Complejidad. Algoritmos y Algoritmia. Introducción. Problemas e instancias. Pablo R. Fillottrani

Fundamentos de programación y Bases de Datos

Agradecimientos. Nota de los autores. 1 Problemas, algoritmos y programas 1

Tema 3. Tipos de datos simples

Estructura de datos. Carrera: IFM Participantes. Representantes de la academia de sistemas y computación de los Institutos Tecnológicos.

Apunte Laboratorio ALPI - El lenguaje de programación Pascal

INTRODUCCION A LA PROGRAMACIÓN ORIENTADA A OBJETOS

PARADIGMAS DE PROGRAMACIÓN CALCULO LAMBDA CALCULO LAMBDA

Universidad Autónoma del Estado de México Facultad de Medicina

UNIVERSIDAD AUTONOMA DE QUERETARO Facultad de Informática

Procedimientos Definidos Localmente

Trabajo Práctico 1 - Programación Funcional Fecha de entrega: Jueves 20 de abril, hasta las 21 hs.

Tipos Recursivos de Datos

Introducción a Python. Cecilia Manzino

INDICE Prologo Capitulo 1. Algoritmos y programas Capitulo 2. La resolución de los problemas con computadoras y las herramientas de programación

Estructuración del programa en partes más pequeñas y sencillas

Tema 5: Introducción a la programación funcional.

Inteligencia artificial

ALGORÍTMICA. Dpto. Ingeniería de Sistemas y Automática Facultad de Ciencias Universidad de Valladolid.

ESCUELA POLITÉCNICA SUPERIOR PRÁCTICA 2: EXPRESIONES, PRINTF Y SCANF

Guía práctica de estudio 05: Diagramas de flujo

Programación Funcional en Haskell

Lambda-Cálculo. Mauro Jaskelioff 6/9/2011

INICIACIÓN A LA PROGRAMACIÓN 1ª parte

Computación I Curso 2016 Facultad de Ingeniería Universidad de la República

Programa Oficial de Asignatura. Ficha Técnica. Presentación. Competencias y/o resultados del aprendizaje. Contenidos Didácticos

Programación Orientada a Objetos

Estructuras de Datos. Dr. Pablo E. Fidel Martínez López Lic. en Ciencias de la Computación UNR

Capítulo 4. Lógica matemática. Continuar

Nociones Básicas de Sémantica: Semántica Denotacional

Tema 7: Recursividad

FI - FUNDAMENTOS DE INFORMÁTICA

UNIVERSIDAD DE ESPECIALIDADES ESPÍRITU SANTO

Tema 2. Concepto de Algoritmo

Transcripción:

Introducción a la programación funcional Salvador Lucas Alba Departamento de Sistemas Informáticos y Computación Universidad Politécnica de Valencia http://www.dsic.upv.es/users/elp/slucas.html

Objetivos Relacionar la noción matemática de función y los lenguajes de programación funcionales Introducir los recursos expresivos básicos de los lenguajes funcionales Introducir el modelo computacional de los lenguajes funcionales

Desarrollo 1. Lenguajes funcionales como lenguajes de programación 2. Historia y evolución de los lenguajes funcionales 3. Ventajas e inconvenientes de los lenguajes funcionales 4. Aplicaciones

Desarrollo 1. Lenguajes funcionales como lenguajes de programación 2. Historia y evolución de los lenguajes funcionales 3. Ventajas e inconvenientes de los lenguajes funcionales 4. Aplicaciones

Concepto de función Concepto de función D E

Concepto de función Función parcial f D E

Concepto de función Función parcial f D Determinismo! E

Concepto de función Función total f D E

Concepto de función Función como transformación D f E

Descripción de una función Extensional - Intensional f D f E D E Grafo de la función Regla de transformación

Descripción de una función Extensional - Intensional Ejemplo: sign:int {neg,cero,pos}

Descripción de una función Extensional - Intensional Ejemplo: sign:int {neg,cero,pos} Descripción extensional: {...,(-2,neg),(-1,neg),(0,cero),(1,pos),(2,pos),...}

Descripción de una función Extensional - Intensional Ejemplo: sign:int {neg,cero,pos} Descripción extensional: {...,(-2,neg),(-1,neg),(0,cero),(1,pos),(2,pos),...} Descripción intensional: neg si x<0 sign(x) = cero si x=0 pos si x>0

Descripción de una función Propiedades de interés computacional Determinismo Dado un argumento de entrada, una función siempre devuelve el mismo resultado Dependencia de los argumentos El resultado devuelto por una función sólo depende de sus argumentos de entrada Extensionalidad Dos funciones son iguales si y sólo si responden igual ante los mismos argumentos

Descripción de una función Propiedades de interés computacional Llamada a una función: Función: f: D E Elemento: d D f(d) E Llamada a la función

Hacia un lenguaje funcional Hacia un lenguaje funcional Planteamiento básico Resolver problemas de cómputo empleando: definiciones de función para especificar problemas llamadas a función para expresar el proceso de cómputo que resuelve el problema planteado

Hacia un lenguaje funcional Hacia un lenguaje funcional Planteamiento básico Resolver problemas de cómputo empleando: definiciones de función para especificar problemas llamadas a función para expresar el proceso de cómputo que resuelve el problema planteado

Hacia un lenguaje funcional Hacia un lenguaje funcional Planteamiento básico f D E El dominio y el codominio...

Hacia un lenguaje funcional Hacia un lenguaje funcional Planteamiento básico f type D =... type E =... D E... se describen mediante tipos.

Hacia un lenguaje funcional Hacia un lenguaje funcional Planteamiento básico f type D =... type E =... D E El grafo de la función...

Hacia un lenguaje funcional Hacia un lenguaje funcional Planteamiento básico f type D =... type E =... D E... mediante ecuaciones. f x =...

Hacia un lenguaje funcional Hacia un lenguaje funcional Planteamiento básico Resolver problemas de cómputo empleando: definiciones de función para especificar problemas llamadas a función para expresar el proceso de cómputo que resuelve el problema planteado

Hacia un lenguaje funcional Hacia un lenguaje funcional Planteamiento básico f f(d) d D E Las llamadas a función requieren un mecanismo de cómputo

Hacia un lenguaje funcional Hacia un lenguaje funcional Planteamiento básico Funciones Dominios y codominios Descripción de una función Llamada a una función Lenguajes funcionales Tipos Ecuaciones de definición de funciones Expresiones sintácticas + Proceso de evaluación por reducción

Hacia un lenguaje funcional Hacia un lenguaje funcional Planteamiento básico Lenguajes funcionales Tipos Ecuaciones de definición de funciones Expresiones sintácticas + Proceso de evaluación por reducción

Desarrollo 1. Lenguajes funcionales como lenguajes de programación 2. Historia y evolución de los lenguajes funcionales 3. Ventajas e inconvenientes de los lenguajes funcionales 4. Aplicaciones

El cálculo lambda El cálculo lambda Motivación Introducido por A. Church entre 1930 y 1940 Modelado de las características computacionales fundamentales de las funciones: Una función tiene argumentos o parámetros formales (que determinan su resultado) Una función se aplica sobre sus parámetros reales (llamada a función) Al evaluar dicha llamada se obtiene el resultado

El cálculo lambda El cálculo lambda Ejemplo: x-y Sintaxis f(x)=x-y g(y)=x-y Notación λ λx.x-y λy.x-y Funciones con nombre Funciones sin nombre

El cálculo lambda El cálculo lambda Ejemplo: Sintaxis Notación λ se evalúan a: (λx.x-y) 5 (λx.x-y) 5 5-y (λy.x-y) 5 Aplicación (λy.x-y) 5 β-reducción x-5

El cálculo lambda El cálculo lambda El cálculo λ proporciona un lenguaje funcional elemental Lenguaje funcional = cálculo λ + `azúcar sintáctico

Lisp Motivación Introducido por J. McCarthy en 1960 Aportaciones (I): Programas como conjunto de definiciones de función Ejecución de un programa como evaluación de una expresión inicial respecto a las definiciones Utiliza la evaluación impaciente (eager) como mecanismo de cómputo

Aportaciones (II): Lisp Motivación Introdujo la expresión condicional (por contraposición a la sentencia condicional) fomentando su uso en definiciones recursivas Utilización de listas y operaciones de orden superior sobre listas (List Processing) Introducción del operador de construcción de listas cons para representar éstas en el ordenador

Lisp Sintaxis Nombre Argumentos Expresión (condicional) Ejemplo: (define mapcar (fun lst) (if (null lst) nil (cons (fun (car lst)) (mapcar fun (cdr lst)) ) ) ) Constructor de listas Recursividad

Iswim Motivación Introducido por P. Landin en 1966 (Iswim: If you see what Imean) Aportaciones (I): Abandono de la sintaxis prefija (para los operadores) a favor de la infija Introducción de una norma de estructuración textual de los programas (layout) para agrupar componentes mediante sangrado

Aportaciones (II): Iswim Motivación Introducción de las cláusulas let y where junto con una noción de recursividad mutua y simultánea de las definiciones de función que permiten controlar el alcance de los identificadores definidos Introducción de una máquina abstracta (la SECD) para compilar lenguajes funcionales

Iswim Sintaxis Ejemplo: e where f x = x a b = 1 o bien e where {f x = x; a b = 1} es distinto de e where f x = x a b = 1

Iswim Sintaxis Ejemplo: o bien let f x = x a b = 1 in e let {f x = x; a b = 1} in e

FP Motivación Introducido por P. Backus en 1978 (FP: Functional Programming) Aportaciones: Abogar por el estilo funcional como superador de las deficiencias del estilo imperativo Proporcionar un núcleo sintáctico reducido con gran capacidad combinatoria

FP Sintaxis Ejemplo: Def IP = (/ +) (α ) Trans es un programa FP que define el producto escalar de un vector. En el programa, /, y α son formas combinatorias (insert, compose y apply to all, respectivamente).

ML Motivación Introducido por R. Milner y otros autores en 1978 (ML: Meta Language) Aportaciones (I): Incorpora un sistema de tipos muy potente e incluye comprobación estática de tipos Utiliza inferencia de tipos para determinar el tipo de cada expresión, en lugar de requerir declaraciones de tipo explícitas

Aportaciones (II): ML Motivación Permite definir estructuras de datos y funciones polimórficas ML también utiliza la evaluación impaciente

ML Sintaxis Ejemplo: val pi = 3.1415927; indicaría a un intérprete ML la intención de definir un valor pi. El intérprete acepta la acción y responde > val pi = 3.1415927: real indicando el tipo que le corresponde.

ML Sintaxis Ejemplo: (1) fun sum1to(n) = n*(n+1) div 2; > val sum1to = fn: int -> int (2) fun area r = pi*r*r; > val area = fn: real -> real

ML Sintaxis Ejemplo: (1) fun triple x = 3*x; > val triple = fn: int -> int (2) val triple = fn x => 3*x; > val triple = fn: int -> int

ML Sintaxis Ejemplo: (1) fun fst (x,y) = x; > val fst = fn: a * b -> a (2) fun snd (x,y) = y; > val snd = fn: a * b -> b

ML Ejemplo: reducción impaciente sum1to(3*3) sum1to(9) 9*(9+1) div 2 9*10 div 2 90 div 2 45 Sintaxis

Hope Motivación Introducido por R. Burstall y otros autores en 1980 Aportaciones (I): Permite la definición, por parte del usuario, de sus propios tipos y estructuras de datos

Aportaciones (II): Hope Motivación Utiliza ajuste de patrones para acceder a las estructuras de datos Utiliza ajuste de patrones para definir las funciones del programa

Hope Sintaxis Ejemplo: días laborables y colores data DiasL == lun++mar++mie++jue++vie ; data Colores == rojo++verde++azul ;

Hope Sintaxis Ejemplo: listas de enteros y listas de caracteres data NumList == nil++cons(num#numlist) ; data CharList == nil++cons(char#charlist) ;

Hope Sintaxis Ejemplo: listas de enteros y listas de caracteres data NumList == nil++cons(num#numlist) ; data CharList == nil++cons(char#charlist) ; Tipos predefinidos

Hope Sintaxis Ejemplo: listas de enteros y listas de caracteres data NumList == nil++cons(num#numlist) ; data CharList == nil++cons(char#charlist) ; Constructores de tipo

Hope Sintaxis Ejemplo: listas de enteros y listas de caracteres data NumList == nil++cons(num#numlist) ; data CharList == nil++cons(char#charlist) ; Constructores de datos

Hope Sintaxis Ejemplo: listas polimórficas typevar tipo ; data List(tipo) == nil++cons(tipo#list(tipo)) Variables de tipo

Hope Sintaxis Ejemplo: notación Hope para listas. Equivalente a: infix :: : 7 ; typevar tipo ; data List(tipo) == nil++tipo::list(tipo) ;

Hope Sintaxis Ejemplo: Las siguientes listas son válidas: 1::2::nil a :: b :: c ::nil lun::mie::nil pero no estas otras no: 1::2::3 a ::3:: c ::nil jue::rojo::nil

Hope Sintaxis Ejemplo: el ajuste de patrones permite acceder a subestructuras: el patrón 1::x representa las listas que empiezan con 1. Cuál de las siguientes listas se ajusta a él? 2::3::nil 2::1::3::nil 1::nil 1::2::nil

Hope Sintaxis Ejemplo: la variable x del patrón 1::x queda ligada a nil y 2::nil, respectivamente, al ajustar las expresiones 1::nil y 1::2::nil a dicho patrón

Hope Sintaxis Ejemplo: el ajuste de patrones puede emplearse para definir funciones: dec Join : list(tipo) # list(tipo) -> list(tipo) ; --- Join(nil,l) <= l ; --- Join(x::y,l) <= x::join(y,l) ;

Hope Sintaxis Ejemplo: [1,2] = 1::2::nil Join([1,2],[3]) 1::Join([2],[3]) 1::2::Join([],[3]) [1,2,3]

Hope Sintaxis Ejemplo: Join([1,2],[3]) 1::Join([2],[3]) 1::2::Join([],[3]) [1,2,3] Join([1,2],[3]) se ajusta a Join(x::y,l) con x:=1, y:=[2], l:=[3]

SASL - Miranda SASL - Miranda Motivación SASL y Miranda fueron introducidos por D. Turner en 1976 y 1985, respectivamente Aportaciones (I): Utilizan evaluación perezosa (lazy) Permiten definir funciones mediante ecuaciones con guardas Permite utilizar la currificación, lo cual facilita la definición de funciones de orden superior

Aportaciones (II): SASL - Miranda SASL - Miranda Motivación En Miranda se introducen facilidades para la definición de listas: listas ZF (comprehension lists) En Miranda se permite el uso de secciones

Ejemplo: SASL - Miranda SASL - Miranda Sintaxis sum1to::int -> int -> int sum1to n = n*(n+1) div 2

SASL - Miranda SASL - Miranda Sintaxis Ejemplo: reducción perezosa sum1to(3*3) (3*3)*((3*3) +1) div 2 9*((3*3) +1) div 2 9*(9+1) div 2 9*10 div 2 90 div 2 45

SASL - Miranda SASL - Miranda Sintaxis Ejemplo: utilización de guardas max:: num -> num -> num max a b = a, if a>b = b, otherwise

SASL - Miranda SASL - Miranda Sintaxis Ejemplo: currificación y orden superior map f [] = [] map f (x:xs) = (f x):map f xs

Ejemplo: listas ZF SASL - Miranda SASL - Miranda Sintaxis Lista de enteros y sus cuadrados: sqlist = [ (n,n*n) n<- [1..] ] Lista de enteros y sus cubos: cubes = [ (x*y) (x,y) <- sqlist ] Producto de enteros: [ (x,y) x,y<-[1..10] ]

SASL - Miranda SASL - Miranda Sintaxis Ejemplo: Secciones. Las declaraciones: doble x = 2*x doble = (2 *) doble = (* 2) definen la misma función

Haskell Haskell fue introducido por P. Hudak y P. Wadler en 1988 Es un lenguaje perezoso que recoge lo mejor de las propuestas anteriores

Otros lenguajes Otros lenguajes Erlang es un lenguaje funcional paralelo desarrollado por Ericsson Clean es otro lenguaje funcional paralelo desarrollado por investigadores de la Universidad de Nimega (Holanda)

Desarrollo 1. Lenguajes funcionales como lenguajes de programación 2. Historia y evolución de los lenguajes funcionales 3. Ventajas e inconvenientes de los lenguajes funcionales 4. Aplicaciones

Ventajas de los LF Ventajas de los LF Proporcionan muchos recursos expresivos ausentes en otros LP: 1. Funciones como ciudadanos de 1ª clase 2. Sistema de tipos: polimorfismo, inferencia 3. Ausencia de efectos laterales 4. Ajuste de patrones para acceder a datos 5. Evaluación perezosa

Ventajas de los LF Ventajas de los LF Los programas funcionales son pequeños y fáciles de mantener Los programas funcionales permiten utilizar técnicas de razonamiento formal La capacidad computacional de los lenguajes funcionales es equivalente a la de la máquina de Turing

Inconvenientes de los LF Inconvenientes de los LF Eficiencia: la arquitectura von Neumann no es la más indicada para implementar cómputos funcionales Algunos algoritmos son de carácter imperativo y no se ajustan bien al estilo funcional

Desarrollo 1. Lenguajes funcionales como lenguajes de programación 2. Historia y evolución de los lenguajes funcionales 3. Ventajas e inconvenientes de los lenguajes funcionales 4. Aplicaciones

Aplicaciones Prototipado en Haskell [HJ93] Erlang y la programación de sistemas de telecomunicaciones y telefonía Especialización de programas Haskell para la asignación de tripulaciones a vuelos [Aug97]

Bibliografía [Hud89] P. Hudak. Conception, Evolution, and Application of Functional Programming Languages. ACM Computing Surveys 21(3):359-411, 1989 [PE93] R. Plasmeijer and M. van Eekelen. Functional Programming and Parallel Graph Rewriting. Addison- Wesley, Reading, MA, 1993 [Rea93] C. Reade. Elements of Functional Programming. Addison-Wesley, Reading, MA, 1993

λ :=