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

Documentos relacionados
Algoritmos y programas. Algoritmos y Estructuras de Datos I

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

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

Tema 3: Tipos y clases

Tema 3: Tipos y clases

Isabelle como un lenguaje funcional

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

ANEXO XVII DE LA RESOLUCION N

Elementos de un programa en C

Programación en C. Algoritmo y Estructura de Datos. Ing. M. Laura López. Programación en C

Programación Funcional Haskell Clase 21

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

El lenguaje C. 1. Identificadores, constantes y variables

Programación Orientada a Objetos Sentencias Java Parte I Ing. Julio Ernesto Carreño Vargas MsC.

FUNDAMENTOS DE INFORMÁTICA

Tema 7. El sistema de clases

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

Principios de Computadoras II

Programación n Orientada a Objetos Sentencias Java Parte I. Ing. Julio Ernesto Carreño o Vargas MsC.

GUÍA BÁSICA DE SCHEME v.4

DESCRIPCIÓN ESPECÍFICA NÚCLEO: COMERCIO Y SERVICIOS SUBSECTOR: INFORMÁTICA

Tema 3. Tipos de datos simples

MASTER PROFESIONAL C# 5 Y ASP.NET MVC 5

Java Avanzado. Guía 1. Java Avanzado Facultad de Ingeniería. Escuela de computación.

Todo programa en 'C' consta de una o más funciones, una de las cuales se llama main.

Caracteres y Cadenas Conversión de Datos Funciones y procedimientos Archivos cabecera. Fundamentos de programación

Manual de turbo pascal

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

Curso de Programación Avanzada en C

Expresiones y sentencias

Unidad II: Análisis semántico

APUNTADORES. Un apuntador es un objeto que apunta a otro objeto. Es decir, una variable cuyo valor es la dirección de memoria de otra variable.

Programación orientada a objetos. Resumen de Temas Unidad 4: Sobrecarga

Tema: Entorno a C# y Estructuras Secuenciales.

INTRODUCCIÓN...9 CAPÍTULO 1. ELEMENTOS DE UN PROGRAMA INFORMÁTICO...11

Exterior del algoritmo. Entorno. Usuario. Procesador. Escribir. v1 v2 v3. Leer. <acción> {; <acción>}

Métodos que devuelven valor Dado el siguiente triángulo rectángulo:

Java para programadores

PROCESADORES DE LENGUAJE EXAMEN FINAL 8-JUNIO-07

Instituto Tecnológico de Celaya

Introducción al lenguaje C

Lección 2 Introducción al lenguaje C

Programación Funcional en Haskell

Fundamentos de Programación Visual Basic

Unidad V Análisis Semántico. M.C. Juan Carlos Olivares Rojas

PHP: Lenguaje de programación

Descripción y Contenido del Curso. Programación C++ Capacity Academy.

Desarrollo de aplicaciones con JAVA, JCreator, JDeveloper NetBeans

Fundamentos de Ciencias de la Computación Trabajo Práctico N 2 Lenguajes Libres del Contexto y Sensibles al Contexto Segundo Cuatrimestre de 2002

PASCAL. Repaso de Pascal Introducción a Python. Pascal. Pascal - introducción. Pascal Declaraciones: Variables. Pascal Declaraciones: Tipos 07/04/2015

Desde los programas más simples escritos en un lenguaje de programación suelen realizar tres tareas en forma secuencial.

Tema 13: Apuntadores en C

Oracle PL/SQL. Programa de Estudio.

Programación. Test Autoevaluación Tema 3

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

Estatutos de Control C# Estatutos de Decisión (Selección)

Programación con Visual C#

Principios de Computadoras II

Universidad de Managua

Fundamentos de programación JAVA

Operadores y Expresiones

FUNDAMENTOS DE INFORMÁTICA

Expresiones Aritméticas. Programación digital I Escuela de Sistemas Facultad de Ingeniería Gilberto Diaz

La clase Integer y sus métodos. Los Operadores (concepto). Operadores Lógicos y a nivel de Bits. Operadores de desplazamiento. Concatenaciones. La Con

1. Cuántas sentencias hay en la secuencia principal del siguiente programa?

Tema 1 Programación Funcional

4. Operadores Operador asignación

El lenguaje Python. Programación Declarativa Avanzada. Curso

Nano Taller de Python

PROGRAMACIÓN UNIDADES

Programación MODULAR: Subalgoritmos - funciones y procedimientos

Lección 2: Creando una Aplicación en Java. 1. Estructura del archivo de una clase. 3. Definiendo clases fundamentos

Constantes. Las constantes no cambian durante la ejecucion de un programa en C++, en C++ existen 4 tipos de constantes:

PROGRAMA DE ASIGNATURA DE PROGRAMACIÓN I

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

En este artículo vamos a conocer los tipos de datos que podemos manejar programando en C.

Lenguajes de Programación

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

Ficha de Aprendizaje N 13

Lenguaje de programación con JAVA

Estructura de datos Tema 2: Tipos Abstractos de Datos (TADs)

TEMA 4. ESTRUCTURAS DE CONTROL

2.2 Nombres, Ligado y Ámbito

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

UNIVERSIDAD AUTÓNOMA DE CHIAPAS LICENCIATURA EN SISTEMAS COMPUTACIONALES

Programación de Computadores 4 Iteraciones y Decisiones. Prof. Javier Cañas. Universidad Técnica Federico Santa María Departamento de Informática

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

Apuntadores (Punteros)

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

Lenguajes de Programación. Juan Zamora O. Semestre II Nombres, Ambitos y Ligados

PROGRAMACION ORIENTADA A OBJETOS EN C++

HERENCIA Y TIPOS. Articulo. Video Audio Altavoces. Amplificador

1

Recursividad. Introducción a la programación

Conversión entre Tipos

Conceptos a tratar. Fundamentos de la Programación Orientada a Objetos Ampliación sobre clases y objetos

Unidad II. Fundamentos de programación en Java. Ing. José Luis Llamas Cárdenas

Introducción a los Algoritmos Validez, Satisfactibilidad, Tipos y Funciones


Lógica y Programación

Transcripción:

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

Paradigma Funcional 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])

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 Las VARIABLES se asocian UNICAMENTE A VALORES (en favor de la noción MATEMATICA!) x=1 La información X 2 del STORE no se Store x=2 X 1 modifica, solo se agrega nueva información

Paradigma Funcional Semántica de valores Desaparece la noción de estado Store Locación de memoria Variable Modificación Asignación Las VARIABLES se asocian UNICAMENTE A VALORES (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 (f x) y z (f x) y z g y z g y z (g y) z (g y) z h z h z

Paradigma Funcional Currying fun add x y = x+y fun add x y = x+y add 3 5 (add 3) 5 g 5 8 Permite definir nuevas funciones mediante la aplicación parcial. Donde g y = 3+y

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 > > val x=2*3; val x:int = 6 Alice ML 1.4 http://www.ps.uni-saarland.de/alice/

ML Tipos predefinidos Simples bool, string, char, int, real true y false true y false la casa ^ grande la casa ^ grande # a # j # a # j 5, 100, ~2 5, 100, ~2 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 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; 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 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 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; 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 "menos de 10" else "10 o mas"; val f: int -> string = fn Expresión condicional + recursividad > fun factorial n = Expresión if n=0 then 1 Condicional else n*factorial(n-1); val factorial: int int = fn Restricciones de tipo en las expresiones condicionales Aplicación Recursiva

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). 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

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]

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

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 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

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 constructores de este tipo!!!

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