Paradigma Funcional Caso de estudio: ML. Lenguajes de Programación 2018

Documentos relacionados
Paradigma Funcional Caso de estudio: ML. Lenguajes de Programación 2017

Laboratorio de Lenguajes de Programación Introducción al lenguaje ML

Introducción a Haskell. Cecilia Manzino

UNIDAD IV Programación Funcional. Lic. Jesús Germán Andrés PAUTSCH - FCEQyN - UNaM

Introducción a OCaml. October 19, 2015

Lenguajes de Programación Programación funcional

Introducción a la programación. Cecilia Manzino

CAPÍTULO IV: 4.1 Introducción a la. Programación Funcional

Tema II: Introducción al Lenguaje Funcional

Aplicación de la Inducción Matemática Programación Funcional. Julio Ariel Hurtado Alegría Departamento de Sistemas Universidad del Cauca

Metodologías de Programación II Introducción a OCaml

Tipos en Haskell. Cecilia Manzino

Algoritmos y programas. Algoritmos y Estructuras de Datos I

Programación funcional

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

Programación Funcional

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

Lenguajes funcionales: λ-cálculo

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

21/03/2018. Variables y Constantes. Los datos de un programa están representados por variables o constantes y tienen asociado un tipo.

En programación funcional no hay instrucciones de asignación; La evaluación de un programa funcional no tiene efectos colaterales; y

Tipos de datos algebraicos

Funciones Segunda parte

Introducción a la programación funcional

Metodologías de Programación II Introducción

Lenguajes de programación. Algoritmos y Estructuras de Datos I. Lenguajes compilados. Lenguajes compilados

Tema 3. Patrones y Definiciones de Funciones

PROGRAMACIÓN EN JAVA

Programación imperativa. Algoritmos y Estructuras de Datos I. Lenguaje C. Segundo cuatrimestre de 2014

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

PROGRAMACIÓN LÓGICA. David Felipe Rico Hernandez Gabriel Esteban Bejarano Delgado

Prefacio 25 Organización de la Unidad Didáctica Cómo utilizar el libro Objetivos docentes... 27

9 DECLARACIÓN DE TIPOS Y PATRONES

Tema 1 INTRODUCCIÓN A LOS LENGUAJES DE PROGRAMACIÓN

Paradigmas de lenguajes de programación. Introducción a la programación imperativa. Lenguaje C. Programación imperativa

Tema 3: Tipos y clases

Tema 3: Tipos y clases

Isabelle como un lenguaje funcional

Tema 3: Tipos y clases

Tema 3: Tipos y clases

Introducción Python funcional fn.py Para terminar. Python funcional. Jesús Espino García. 8 de Noviembre de 2014

Introducción a Haskell. El lenguaje Haskell

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

Análisis semántico: Comprobación de tipos

ANEXO XVII DE LA RESOLUCION N

Guía del Curso IFCD052PO PROGRAMACIÓN EN JAVA

Programación Concurrente y Distribuida Paso de mensajes

Tema 6: Programación funcional en Scala. Sesión 18: Programación funcional en Scala

Tema 1: Introducción a la programación funcional

Laboratorio Análisis Lógico Práctica 1

Tema 3. Patrones y Definiciones de Funciones

Lenguajes de Programación I

Compiladores: Análisis Semántico. Pontificia Universidad Javeriana Cali Ingenieria de Sistemas y Computación Prof. Gloria Inès Alvarez V.

Tema 1: Introducción a la programación funcional

ING1310 Introducción a la Computación. Python. Conceptos Básicos. Carlos Reveco

8 INTRODUCCIÓN AL OBJECTIVE CAML

Tema 2: Introducción a Haskell

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

Programación 1 Tema 3. Información, datos, operaciones y expresiones

Tema 4: Definición de funciones

Tema 4: Definición de funciones

El sistema de clases de Haskell. Introducción

Un calculadora avanzada... y algo más!

Lenguajes de programación ANÁLISIS LÓGICO LENGUAJES DE PROGRAMACIÓN. Sintaxis y semántica formales. Lenguaje IMP

Lenguajes de programación LÓGICA COMPUTACIONAL LENGUAJES DE PROGRAMACIÓN. Sintaxis y semántica formales. Lenguaje IMP

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

Tema 1: Programación Funcional

Comprender las diferencias entre tipos de datos primitivos similares, y aprender a elegir el tipo más conveniente en cada caso.

Variables, expresiones y sentencias

Programación Declarativa Haskell Informática Sistemas Curso Pepe Gallardo Universidad de Málaga. Tema 8. Listas

Tipos de Datos Simples Contenido del Tema

Procesadores de lenguaje Tema 5 Comprobación de tipos

Programación Funcional

DEMOSTRACIÓN AUTOMÁTICA DE TEOREMAS

Tema 2. Tipos predefinidos

Programación Concurrente y Distribuída Estado Compartido, 2010

Lenguajes de Programación

abril de 2017 Desarrollo de aplicaciones en Java Tipos de datos primitivos Tipos de datos Elementos de aplicaciones simples

Informática Haskell Matemáticas Curso Pepe Gallardo Universidad de Málaga. Temario

Entendiendo expresiones lambda en C# con Mono

Arreglos y Subrangos

1.1 Tipos de Datos Primitivos. 1.2 Tipos de datos estructurados. 1.3 Definición de estructura de datos

I Programación funcional básica con Haskell 98 1

Repaso Lenguaje C Área de Servicios Programación (Ing. Elect. y Prof. Tec.), Programación I (TUG y TUR) y Electrónica programable (TUE)

Tema 4.- Recursión e iteración

Una lista de operadores que pueden o no sobrecargarse es la siguiente: Operadores que pueden sobrecargarse

Programación Funcional Haskell Clase 19

Tema 9: Asignación, estado local y modelo de entornos

Programación Funcional Haskell Clase 22

Tutorial Haskell David Julián Guzmán Cárdenas Cristian Alexanther Rojas Cárdenas Luis Ernesto Gil Castellanos

Programación.Net Lenguaje C#

Programación 1 Tema 5. Instrucciones simples y estructuradas

REPRESENTACIÓN DE DATOS

Unidad Didáctica 2. Elementos básicos del lenguaje Java Tipos, declaraciones, expresiones y asignaciones

Diseño de compiladores Recordando la clase anterior

Apunte Laboratorio ALPI - El lenguaje de programación Pascal

Índice general 7. Presentación 15

Transcripción:

Paradigma Funcional Caso de estudio: ML Lenguajes de Programación 2018

FUNCIÓN: Mapeo de un dominio en un rango El mapeo se puede describir por medio de una EXPRESIÓN f(1) = 2 f(2) = 3 Enumeración f(x) = 1 + x Expresión

Paradigma Funcional La computación se logra mediante la evaluación de expresiones NO mediante ejecución de sentencias!! La característica esencial de la programación funcional es que los cálculos se ven como una función matemática que hace corresponder entradas con salidas. A diferencia de la programación imperativa, no hay una noción implícita de estado, Por lo tanto, no hay instrucciones de asignación.

Paradigma Funcional Ejemplos: Lisp (años 60 - sin tipos) FP (años 70 sin tipos) ML, Scheme, Hope, Miranda (años 80 - tipados) Haskell, Earlang (años 90 tipados) El fundamento de la programación funcional es el CALCULO LAMBDA (Church [1941]): (λx. x*x)

Paradigma Funcional Los Lenguajes Funcionales se caracterizan por: Conjunto de Objetos Conjunto de Funciones Primitivas Conjunto de Formas Funcionales Operación de Aplicación

Paradigma Funcional Objetos Miembros del Dominio y Rango de las funciones. Depende de las características del lenguaje. Funciones Primitivas Las funciones que provee el lenguaje como predefinidas Depende del dominio de aplicación del lenguaje.

Paradigma Funcional Formas Funcionales (Funciones de alto orden) Son las funciones cuyo argumento o resultado es una función. Tienen un fuerte impacto en la expresividad del lenguaje. Operación de Aplicación Es el principal mecanismo de control. Como las funciones se llaman entre si y como se aplican sus argumentos.

Paradigma Funcional Propiedades de los lenguajes funcionales puros: Semántica de valores Transparencia referencial Funciones como valores de primera clase Currying Evaluación perezosa

Paradigma Funcional Semántica de valores Desaparece la noción de estado Locación de memoria Variable Modificación Asignación Store Una VARIABLE se asocia a UN VALOR (en favor de la noción MATEMATICA!) X 2 X 1 x=1 x=2 La información del STORE no se modifica, solo se agrega nueva información

Paradigma Funcional Semántica de valores Desaparece la noción de estado Locación de memoria Variable Modificación Asignación Store Una VARIABLE se asocia a UN VALOR (en favor de la noción MATEMATICA!) X 2 X 1 x=1 fun f1 = x+2 x=2 fun f2 = x+2 3 f1 f2 4

Paradigma Funcional Transparencia referencial Lenguajes funcionales: Una función computa diferentes resultados únicamente a partir de su argumento. Para el mismo valor del argumento siempre dará el mismo resultado. No hay efectos colaterales.

Paradigma Funcional Funciones como valores de primera clase Pueden ser pasadas como argumento Pueden ser retornadas como resultado de otras funciones Pueden combinarse para componer nuevas funciones

Paradigma Funcional Currying Llamada a función que toma múltiples argumentos como una cadena de llamadas a funciones de 1 argumento f x y z (f x) y z g y z (g y) z h z

Paradigma Funcional Currying fun add x y = x+y El tipo de la función curry es: int -> (int -> int) add 3 5 (add 3) 5 g 5 8 Permite definir nuevas funciones mediante la aplicación parcial. Donde g y = 3+y int -> int

Paradigma Funcional Evaluación perezosa Orden de evaluación no estricto Se evalúa cada parte del argumento de una función solo cuando es indispensable. Donde además, se recuerdan los valores de los argumentos ya calculados para evitar su reevaluación (call by need)

ML

ML Creado por Robin Milner en los años 70. Standard ML nació en 1983. Soporta el paradigma funcional Fuertemente tipado Sistema de tipos polimórfico Tiene soporte para definir TDAs Alcance estático Mecanismos para el manejo de excepciones

ML Versión Alice ML 1.4 > > val x=2*3; val x:int = 6 http://www.ps.uni-saarland.de/alice/

ML Tipos predefinidos Simples bool, int, string, real, char true y false (andalso, orelse) la casa ^ grande # a # j 5, 100, ~2 5.0, 10.23 Estructurados (entre otros ) Listas (secuencia) Tuplas (producto cartesiano) Listas [1, 2] Tipo: int list Notacion [1,2,3,4] Cabeza::Cola nil o [ ] = lista vacia Tuplas (1, 2.5, [1,2]) Tipo: int*real*int list

ML Identificadores, Ligaduras y Declaraciones Los identificadores antes de usarse deben declararse Una variable se declara al ligarla a un valor usando la palabra reservada val > val x=2*3; ML mantiene un ambiente con todas las ligaduras creadas val en realidad liga un nombre a un valor resultante de una expresión Una función en general se declara al ligarla a su expresión usando la palabra reservada fun > fun f x = x+1;

ML Inferencia de tipos Los tipos de las variables no son (aunque pueden ser) especificados explícitamente en las declaraciones. El tipo de una variable es inferido a partir del tipo del valor al que fue ligada o por las operaciones en las que la variable interviene. > val x=2*3; val x: int = 6

ML Inferencia de tipos El tipo de una función se determina de acuerdo al tipo del argumento y del resultado. > fun f x = x+1; val f : int -> int = fn El tipo del resultado se infiere según el tipo del rango de la expresión que lo computa.

ML Inferencia de tipos ML tiene operadores sobrecargados No tiene coerción (no soporta expresiones mixtas) Permite realizar conversiones explícitas 2+3.14 es una expresión débilmente tipada No permitida por ML

ML Funciones > fun doble x = 2*x; val doble: int int = fn Evaluación Ansiosa fun nombre argumento = expresion; Las funciones tienen siempre UN único argumento. El resultado de la función es el resultado de evaluar la expresión que la define con el argumento dado. Evaluación perezosa: expresión condicional, expresiones handle, andalso, oresle

ML Funciones Las funciones tienen siempre UN único argumento. >fun f (x, y) = x+2*y; val f : (int * int) -> int = fn Múltiples argumentos TUPLAS o currying

ML Funciones curried > fun producto x y = x*y; val producto : int -> int -> int = fn Aplicación parcial (principal utilidad) > val portres = producto 3; val portres : int -> int = fn Son funciones que, por la manera en la que fueron definidas, permiten definir nuevas funciones mediante la aplicación parcial

ML Funciones Expresión condicional > fun f x = if x<10 then "menor que 10" else "mayor o igual que 10"; val f: int -> string = fn > fun factorial n = Expresión condicional + recursividad if n=0 then 1 else val factorial: int int = fn Restricciones de tipo en las expresiones condicionales n*factorial(n-1); Aplicación Recursiva Expresión Condicional

ML Funciones definidas mediante cláusulas > fun escero 0 = true escero n = false; val escero : int -> bool = fn Definición por partes de acuerdo al argumento DEBEN ESTAR DEFINIDAS PARA TODOS LOS VALORES DEL DOMINIO (totales). Se resuelve el flujo de control mediante pattern matching.

ML Funciones con referencias a variables no locales > val c = 2.5; val c : real = 2.5 > fun multx x = x*c; val multx : real -> real = fn Se comporta como una constante literal LF puros: Una función computa distintos valores de acuerdo a su argumento (no olvidar la semántica de valores y trasparencia referencial). Misma entrada misma salida

ML Funciones polimórficas Función que se comporta de manera uniforme sobre un conjunto de tipos POLITIPO: tipo que contiene variables de tipo El tipo de una función polimórfica es un politipo: POLIMORFISMO PARAMÉTRICO > fun invertir(nil) = nil invertir(x::xs) = invertir xs @ [x]; val invertir : 'a list -> 'a list = fn Una gran ventaja de ML es que permite que las funciones definidas por el usuario puedan ser polimorfas. Otros lenguajes con tipos como C++ tienen operadores polimórficos predefinidos pero las funciones definidas por el usuario no pueden serlo.

ML Funciones de alto orden (Formas Funcionales) Funciones que emplean otras funciones como argumentos y/o resultado Ejemplo: función simplemap Toma como argumento una función f y una lista L, y retorna una lista LR tal que cada elemento LRi=f(Li) > fun simplemap(f, nil) = nil simplemap(f, h::t) = F(h)::simpleMap(F, t); val simplemap : (('a -> 'b) * 'a list) -> 'b list = fn

ML Funciones de alto orden (Formas Funcionales) Funciones que emplean otras funciones como argumentos y/o resultado Ejemplo: función simplemap Toma como argumento una función f y una lista L, y retorna una lista LR tal que cada elemento LRi=f(Li) > fun simplemap(f, nil) = nil simplemap(f, h::t) = F(h)::simpleMap(F, t); val simplemap : (('a -> 'b) * 'a list) -> 'b list = fn MLWorks> simplemap(par, [3, 5, 6, 10]); val it : bool list = [false, false, true, true]

ML Funciones de alto orden (Formas Funcionales) Funciones que emplean otras funciones como argumentos y/o resultado Ejemplo: función simplemap Toma como argumento una función f y una lista L, y retorna una lista LR tal que cada elemento LRi=f(Li) > fun simplemap(f, nil) = nil simplemap(f, h::t) = F(h)::simpleMap(F, t); val simplemap : (('a -> 'b) * 'a list) -> 'b list = fn MLWorks> simplemap(length, [[], [1,2,3],[3]]); val it : int list = [0, 3, 1]

ML Funciones de alto orden (Formas Funcionales) Funciones que emplean otras funciones como argumentos y/o resultado Ejemplo: función simplemap Toma como argumento una función f y una lista L, y retorna una lista LR tal que cada elemento LRi=f(Li) > fun simplemap(f, nil) = nil simplemap(f, h::t) = F(h)::simpleMap(F, t); val simplemap : (('a -> 'b) * 'a list) -> 'b list = fn MLWorks> simplemap(length, [["si"], [], ["hola", "chau"]]); val it : int list = [1, 0, 2]

Python Características asociadas al Paradigma Funcional

Python Pyhton es un lenguaje que solo admite el Paradigma Funcional Tiene herramientas que facilitan la creación de programas que siguen los lineamientos del paradigma No cuentan con todas las características fundamentales requeridas por el paradigma A continuación veremos algunas de las caracteristicas que lo acercan al paradigma

Python Funciones como Objetos En Python las funciones son un objeto del lenguaje Pueden ser el Argumento de una Función Es aplicar una función de alto orden? >def por2(x): return X*2 >def por3(x): return X*3 >def aplicar(funcion,arg): return Funcion(Arg) >aplicar(por2, 4) 8 >aplicar(por3, 4) 12

Python Funciones como Objetos En Python las funciones son un objeto del lenguaje Pueden ser el Argumento de una Función Pueden ser parte de Estructuras de Datos >def por2(x): return X*2 >def por3(x): return X*3 >Lista = [por2, por3] >Lista[0](4) 8

Python Funciones como Objetos En Python las funciones son un objeto del lenguaje Pueden ser el Argumento de una Función Pueden ser parte de Estructuras de Datos Pueden ser la Salida de una Función Es darnesimo una función de alto orden? >def por2(x): return X*2 >def por3(x): return X*3 >Lista = [por2, por3] >def darnesimo(lista, N): return Lista[N] >darnesimo(lista, 0)(4) 8

Python Aplicación Parcial En Python como en varios lenguajes funcionales no hay Currying Aun así, el lenguaje cuenta con un mecanismo de aplicación parcial Para esto es necesario utilizar la función partial de la librería functools >import functools >def suma(x,y): return X+Y >suma3 = functools.partial(suma, Y=3) >suma3(5) 8 Con X esto no funciona Por qué creen que es asi?

Python Conjuntos por Comprensión Una noción clásica en matemática es la de definir conjuntos por comprensión: Python al igual que varios lenguajes Funcionales permite crear este tipo de estructuras mediante: Listas por Comprensión Generadores ML no tiene este tipo de constructores!

Python Listas por Comprensión Las Listas por comprensión permiten crear listas finitas utilizando una notación similar a la de conjuntos por comprensión > S = [ 2*X for X in range(5) if(x*x > 3) ] > S [4, 6, 8] Por qué tiene que ser Finito?

Python Expresiones Generadoras Python tiene otro mecanismo especial para modelar estructuras infinitas, conocidos como expresiones generadoras. > S = ( 2*X for X in Naturales() if(x*x > 3) ) Que queda almacenado en S? Basicamente un iterador Como Implementarian Naturales()? También con un Iterador!

Python Función Generadora Las funciones como Naturales() son llamadas Funciones Generadoras y permiten crear un iterador básico Para esto se valen de la instruccion yield Es una instrucción de retorno, que a diferencia del return, la función mantiene el ambiente (vars locales y punto de ejecución) > def Naturales(): X = 0 while(true): X = X+1 yield X Esta Función genera un iterador que permite recorrer todos los números naturales

Referencias: Apuntes sobre paradigmas de programación, Ignacio Ponzoni y Jessica Carballido