Programación funcional en C#
Via Barrapunto me llega la referencia a una página en la que se da un buena introducción a la programación funcional (en inglés).
La mayoría de nosotros estamos acostumbrados a programar de forma imperativa, aunque seguramente a más de uno le habrá tocado lidiar con algún lenguaje funcional, como LISP, en la Universidad. En lo que a mi respecta, mi relación práctica con estos lenguajes es únicamente este lenguaje y hace ya bastantes años. Sin embargo sí que recuerdo algunos conceptos del cálculo lambda que me han venido bien en alguna ocasión. Desde entonces he ido leyendo de vez en cuando referencias a lenguajes como Haskell y Erlang, con cierta curiosidad, y he recordado también que hace ya bastante tiempo estuve revisando las líneas futuras del lenguaje C# y vi algo relacionado con cálculo lambda.
Como resumen del artículo citado, los lenguajes funcionales se basan el que todo son funciones y los programas se construyen en base a funciones que reciben como parámetros otras funciones. No existen las variables y por lo tanto no existe la necesidad de mantener el estado. Esto que puede chocarnos desde el punto de vista de la programación imperativa, no impide que sea posible realizar cualquier programa con este tipo de lenguajes, únicamente cambiando la forma de pensar a la hora de programar. El carecer de estado permite que todas las instrucciones del programa sean paralelizables de forma directa, ya que no hay dependencias ni posibles conflictos, ni colisiones entre ellas. Además permite no solo que sean paralelizables, sino incluso que se retarde la ejecución de una instrucción hasta que se vaya a hacer uso de ella.
C# ha ido adoptando diferentes características de la programación funcional en sus diferentes versiones, conforme ha sido necesario. Así por ejemplo desde la versión 1.0 del lenguaje es posible la utilización de delegados, que permiten representar funciones y utilizarlas como parámetros en otras funciones. Desde la versión 2.0 es posible la utilización de tipos y procedimientos polimórficos gracias a los generics
, los métodos anónimos para la creación objetos delegados y closure
, y abstracciones de stream con Iterators. En la más reciente versión 3.0 (.NET framework 3.5), existen otro conjunto de posibilidades tomadas de la programación funcional, que se han utilizado principalmente para el desarrollo de LINQ, como las expresiones lambda, que permiten una escritura sencilla de métodos anónimos cuyo cuerpo son expresiones, la inferencia de tipos, y los expression trees.
Más información
Aquí hay una traducción del artículo «Functional programming for the rest of us» al español, del que habla esta entrada del blog.
http://ademirar.wordpress.com/2010/08/28/programacion-funcional-para-el-resto-de-nosotros/
Saludos.