Entendiendo expresiones lambda en C# con Mono

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

GUIA 2: Repaso sobre uso de C#. Funciones, métodos y arreglos.

2.2 Nombres, Ligado y Ámbito

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

Capítulo 16. Diagrama de Clases UML

Introducción a Python. Cecilia Manzino

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

INTRODUCCION A LA PROGRAMACIÓN ORIENTADA A OBJETOS

Guia#9: Punteros en C#.

Cuales son los 6 lenguajes de programacion mas usados actualmente. Cuales son los 6 lenguajes de programación mas usados actualmente.

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

Planificaciones Algoritmos y Programación I. Docente responsable: CARDOZO MARTIN MIGUEL. 1 de 8

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

INICIACIÓN A LA PROGRAMACIÓN 1ª parte

Generación de Código Intermedio

Algoritmos y Programación I. Curso Prof. Arturo Servetto

Universidad Centroccidental Lisandro Alvarado. Decanato de Ciencias y Tecnología Departamento de Sistemas

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

Academia de computación de IE, ICA e ISISA. Unidad didáctica Programación Orientada a Objetos

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

ESTRUCTURAS DE CONTROL

PROGRAMACIÓN. UNIDAD II. ALGORITMO PROFA : HAU MOY

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

Herencia en Java. Agustín J. González Diseño y Programación Orientados a Objetos

Guía práctica de estudio 04: Clases y objetos

Tema: Sobrecarga. Objetivos. Materiales y Equipo. Introducción Teórica. Programación II. Guía No. 7

Programación Orientada a Objetos con Java

Matemática y programación

Diseño de Compiladores I. Estructura General de un Compilador

UNIVERSIDAD DE SAN CARLOS DE GUATEMALA FACULTAD DE INGENIERIA ESCUELA DE CIENCIAS Y SISTEMAS

UAA-DSE Programación 2 / C++ Eduardo Serna-Pérez

Tema: Funciones, Procedimientos y Recursividad en C#.

UNIVERSIDAD MAYOR DE SAN SIMON FACULTAD DE CIENCIAS Y TECNOLOGÍA PLAN GLOBAL COMPUTACION I

Tema 2: Características de la programación funcional

ESTRUCTURA DE ASIGNACIÓN

! Qué es la POO?! Un paradigma de programación. ! No hay paradigmas mejores ni peores! Todos tienen sus ventajas e inconvenientes

Tema 2 Conceptos básicos de programación. Fundamentos de Informática

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

POST REQUISITO: CATEGORIA: Obligatorio SEMESTRE: Primer Semestre 2015 HORAS POR SEMANA DEL LABORATORIO: DIAS QUE SE IMPARTE EL LABORATORIO:

Unidad Didáctica 3. Tipos genéricos. Fundamentos de Programación Departamento de Lenguajes y Sistemas Informáticos

Desarrollo de aplicaciones con JAVA, JCreator, JDeveloper NetBeans

Guía práctica de estudio 06: Estructuras de repetición

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

PROGRAMACIÓN EN C#.NET Programación Orientada a Objetos en C# Ing. Bruno López Takeyas

Computación II. Introducción a Visual Basic

Módulo 2: Algoritmos (continuación)

PROGRAMACIÓN UNIDADES

Lenguajes de Programación

Nombres, Ligaduras, Chequeo de Tipos y Alcance. Luis Garreta (Basados en el libro de Robert Sebesta)

Tutorial de C# Delegados y Eventos. Por: Óscar López, M.Sc.

AREA A LA QUE PERTENECE: 103 Matemática Básica 2 34 créditos POST REQUISITO: CATEGORIA: Obligatorio SEMESTRE: Primer Semestre 2015

Conversión entre Tipos

Tema 2 Introducción a la Programación en C.

Tema 01: Algoritmia y diagramas de flujo. Estructuras de datos (Prof. Edgardo A. Franco)

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

Programación Avanzada CONCEPTOS BÁSICOS DE IMPLEMENTACIÓN EN C++

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

Métodos para escribir algoritmos: Diagramas de Flujo y pseudocódigo

Metodologías de Programación II Introducción

DIAGRAMAS UML ANDRÉS ESTEBAN MARTÍNEZ HUTA CICLO DE VIDA DEL SOFTWARE GLORIA CECILIA RÍOS MUÑOZ

Capítulo 9. Introducción a los lenguajes formales. Continuar

Programación Orientada a Objetos Profr. Pedro Pablo Mayorga

Metodología y Tecnología de la Programación

Tema 6: Clases. Índice

Elementos de un programa en C

Procesadores de lenguaje Tema 5 Comprobación de tipos

PROGRAMA DE ASIGNATURA DE PROGRAMACIÓN I

TEMA 6: INTRODUCCIÓN A UML

ALGORITMOS, ESTRUCTURAS Y PROGRAMACION

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

Programación I Unidad III. Tema: Tipos, estructuras y uniones

Tema: Tipos Abstractos de Datos (TAD s) en C#.

Programación de Ordenadores

Diseño de compiladores. Organización de memoria. Organización de memoria. Organización de memoria. Zona de código 04/05/2014 ORGANIZACIÓN DE MEMORIA

LENGUAJE DE PROGRAMACIÓN ESTRUCTURADO

Conceptos de Programación Orientada a Objetos

UNIVERSIDAD AUTONOMA DE QUERETARO Facultad de Informática

Unidad II: Análisis semántico

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

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

Para crear un arreglo de cualquier tipo de elementos la sintaxis es:

Algoritmos y solución de problemas. Fundamentos de Programación Otoño 2008 Mtro. Luis Eduardo Pérez Bernal

Tema: Arreglos de objetos en C#.

Programación Orientada a Objetos

MASTER PROFESIONAL C# 5 Y ASP.NET MVC 5

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

Evolución del software y su situación actual

PRÁCTICA FUNDAMENTOS DE ALGORITMOS I. Objetivos

Lenguaje C. República Bolivariana de Venezuela Fundación Misión Sucre Aldea Fray Pedro de Agreda Introducción a la Programación III

Funciones como parámetros, funciones como resultados. Introducción a la Computación Patricia Borensztejn Clase 26

Nombre de la asignatura: Diseño Estructurado de Algoritmos. Carrera: Ingeniería en Sistemas Computacionales. Clave de la asignatura: SCB-9316

GUÍA BÁSICA DE SCHEME v.4

Transcripción:

Entendiendo expresiones lambda en C# con Mono Martín O. Márquez <xomalli@gmail.com> Introducción La programación imperativa es uno de los paradigmas de computación más ampliamente utilizados por la mayoría de lenguajes de programación de alto nivel debido al gran soporte académico y comercial y a que los programas son relativamente independientes del tipo de computadora donde se ejecutan porque los lenguajes de programación deben abstraer las operaciones del modelo de máquina para la cual se diseñaron. La programación imperativa se basa en el modelo de la máquina de von neuman, del cual la mayoría de las computadoras personales y estaciones de trabajo tienen elementos comunes. Aunque menos utilizado existe otro paradigma que a diferencia del imperativo se basa en las matemáticas (aplicación de funciones) con el cual igualmente podemos expresar operaciones computacionales de forma mas compacta y abstracta, este paradigma se conoce como programación funcional. Uno de los muchos elementos del paradigma funcional que.net incluye desde la versión 3.0 son las expresiones lambda (lambda expression). Programación Funcional Los conceptos básicos de la programación funcional datan de 1956 a 1958 con el trabajo de Jonh McCarthy en el desarrollo y diseño de LISP (List Processor), este lenguaje esta basado en el calculo lambda que sento las bases de los lenguajes funcionales, características como: Recursión: se utiliza para para realizar operaciones repetitivas, no utiliza la iteracion. Funciones de primer orden: las funciones tienen el mismo nivel que cualquier otro elemento del lenguaje,pueden aplicarse a valores, evaluarse, regresar un valor y ser parámetros de otras funciones. No requiere asignación: el computó se realiza aplicando funciones a los argumentos. Garbage collector: Se reclaman los objetos que no están siendo utilizado por el programa. Tipado dinámico (Dynamic typing): La comprobación del tipo se realiza en tiempo de ejecución, los valores tienen tipos pero las variables no. El paradigma funcional se basa en el concepto matématico de función, que la mayoría de los lenguajes de programación imperativos y funcionales comparten y cuya definición es (1)Una funcion f es una regla que asigna a cada elemento x de un conjunto A exactamente un elemento llamado f(x) de conjunto B Donde la programación funcional marca su diferencia con la imperativa es que para la programación funcional cada programa es equivalente a esta definicion donde x es el argumento o dominio de f mientras que y es el rango de f o la salida sea los programas son cajas negras donde solo importa el que se esta computando y no el como se esta computando que es el caso de la

programación imperativa. En resumen cuando se programa de forma funcional se piensa más en expresiones y su significado que en una secuencia de operaciones en memoria. Tipos Delegate y métodos anónimos Desde sus primeras versiones.net introdujo el objeto delegate (delegado) que es un tipo particular de objeto (un delegate deriva de la clase base System.Delegate), que puede encapsular la referencia a un método estático o de una instancia como si fuera un mecanismo de callback(devolución de llamada) similar a los apuntadores de función de C y C++ pero con la importante diferencia de que proporciona un tipado seguro (type-safety) para evitar errores en tiempo de ejecución y que puedan detectarse en tiempo de compilación si la función no coincide con la firma del método al que hace referencia. Esto posibilita en un contexto de programación orientada a objetos que los métodos pueden recibir como argumentos otros métodos además de tipos primitivos y de referencia. Veamos un ejemplo para ilustrar estos conceptos con C#. En versiones anteriores a C# 2.0 (1.1,1.0) los delegate se utilizaban como en el siguiente listado: Listado 1.1 Uso de métodos como parámetros en C# 1.1 namespace Samples //definimos al objeto que guardara las referencias a los metódos Console.WriteLine("0 Fahrenheit = 1:0.00 Celsius", x, ApplyF(x, Temp.GetCelsius)); Console.WriteLine("0 Fahrenheit = 1:0.00 Kelvin", x, ApplyF(x, Temp.GetKelvin)); //el metódo que aplicará el metódo que es su segundo argumento static double ApplyF(double d,gettemp f) //la implementación de cada metódo class Temp public static double GetCelsius(double fahrenheit) public static double GetKelvin(double fahrenheit) Aquí observamos que los métodos que implementan la funcionalidad deben declararse de una manera completamente procedural e imperativa.

public static double GetCelsius(double fahrenheit) public static double GetKelvin(double fahrenheit) C# 2.0 al incorporar los métodos anónimos se acerca más a la programación funcional al asociar un bloque de código a un delegate sin necesidad de tener toda su implementación en un metodo sino dentro de la misma declaración del objeto, como mostramos en el siguiente listado que es el listado anterior pero usando métodos anónimos. Listado 1.2 Métodos como parámetros utilizando métodos anónimos. namespace Samples Console.WriteLine("0 Fahrenheit = 1:0.00 Celsius", x, ApplyF(x, delegate(double fahrenheit) )); Console.WriteLine("0 Fahrenheit = 1:0.00 Kelvin", x, ApplyF(x, delegate(double fahrenheit) )); static double ApplyF(double d, GetTemp f) Aquí observamos la diferencia con respecto al código anterior del listado 1.1. Console.WriteLine("0 Fahrenheit = 1:0.00 Celsius", x, ApplyF(x, delegate(double fahrenheit) )); Console.WriteLine("0 Fahrenheit = 1:0.00 Kelvin", x, ApplyF(x, delegate(double fahrenheit) ));

Expresiones Lambda (Lambda Expressions) Las expresiones lambda provienen del cálculo lambda (lambda calculus) desarrollado por Alonzo Church en los años 1930 s como una notación para representar todas las funciones computables equivalentes a una máquina de Turing, todos los lenguajes funcionales pueden ser vistos como una variante sintáctica del cálculo lambda. Las expresiones Lambda son útiles para sintetizar funciones con pocos parámetros que regresan algún valor, esta expresión consiste básicamente en una regla de sustitución que expresa tal cual una función o sea un mapeo de los elementos del conjunto dominio a los elementos de un codominio por ejemplo en la siguiente expresión: cuadrado : integer integer donde cuadrado(n) = n² se reduce a una notación que produce una función anónima donde los únicos símbolos son la letra lambda (λ) y el punto (.). λn.n² En la mayoría de los lenguajes funcionales las funciones anónimas son valores representados por la palabra reservada lambda, como el caso de LISP. Lambda (n)(**n) Aunque C# no utiliza los símbolos de la notación matemática lambda, el operador lambda es => que significa tiende a o va hacia a, la estructura de una expresión lambda en C# es: (Argumentos de entrada) => (salida al procesarlos) En caso de únicamente una variable la sintaxis es: (x) => (x*x) En caso de múltiples argumentos la sintaxis es: (x,y,z) => () aquí es importante saber que es el tipo delegate que dicta el tipo de los parámetros de entrada y de salida. Listado 1.3 Métodos como parámetros utilizando expresiones lambda namespace Lambdas Console.WriteLine("0 Fahrenheit = 1:0.00 Celsius", x, ApplyF(x, (fahrenheit) => ((fahrenheit - 32) * (5 / 9D)))); Console.WriteLine("0 Fahrenheit = 1:0.00 Kelvin", x, ApplyF(x, (fahrenheit) => (fahrenheit + 460)));

static double ApplyF(double d, GetTemp f) Podemos observar que de los métodos anónimos a las expresiones Lambda, nos queda una sintaxis más legible y compacta. (fahrenheit) => ((fahrenheit - 32) * (5 / 9D)) (fahrenheit) => (fahrenheit + 460)) El resultado de la ejecución del programa es el mismo con cada uno de los listados. Conclusión Para los nuevos retos en el desarrollo de software, es importante que los lenguajes de programación incorporen características de un paradigma de programación diferente a ellos para extender sus capacidades y así poder expresar algoritmos de una manera compacta y más concisa esto da como resultado un código más legible. Los ejemplos pueden ser descargados de http://xomalli.blogspot.com/ Este documento está protegido bajo la licencia de documentación libre Free Documentacion License del Proyecto GNU, para consulta ver el sitio http://www.gnu.org/licenses/fdl.txt, toda persona que lo desee está autorizada a usar, copiar y modificar este documento según los puntos establecidos en la «Licencia FDL»