Estuve en el Lambda World

Escribo estas líneas volviendo en tren desde Cádiz, una ciudad enigmática que me recuerda muchísimo a mi añorada Habana, tal vez porque la segunda se construyera basándose en la primera.

Cádiz, además de ser la ciudad que acogió la firma de la primera Constitución Española en 1812, ha acogido el pasado fin de semana el primer evento internacional de programación funcional celebrado en España, el Lambda World.

En este evento, ponentes de todas partes del mundo han venido a contarnos acerca de características de la programación funcional como mónadas, funciones puras, inmutabilidad, efectos secundarios, o sobre cómo llevar conceptos de programación funcional a programación orientada a objetos.

Para ello, hemos visto ejemplos en lenguajes como F#, C#, Java, Ruby, Swift, y, sobre todo, Scala. He aprendido muchísimo y aquí resumo algunos conceptos que me han llamado la atención y que me toca seguir estudiando.

La inmutabilidad, más complicada pero menos propensa a errores.

En programación orientada a objetos definimos clases con propiedades y comportamiento. Este comportamiento suele implicar un cambio en el estado del objeto.

Sin embargo, es justamente lo que queremos evitar en programación funcional, ya que trabajamos con objetos inmutables, con lo cual una vez creados, no cambia ninguna de sus propiedades.

Esto también se aplica a colecciones, y a los miembros de la misma, con lo cual la acción de añadir un objeto a una colección, o modificar un objeto de la misma requiere crear una nueva colección.

Con estos objetos inmutables lo que conseguimos asegurarnos que su estado no va a cambiar, y que no vamos a tener «sorpresas» cuando pasemos un objeto a un método que de repente modifique alguna de sus propiedades.

Sin embargo, aunque lenguajes como Swift, Scala o F# soportan inmutables por diseño, en el mundo clásico de la orientación a objetos, tanto para Java, C# o Ruby, es justamente al contrario, y queda de nuestra mano utilizar colecciones inmutables y definir manualmente nuestros objetos.

Las funciones puras no generan efectos secundarios, o casi

Otro concepto que se repitió bastante en el evento era el de función pura, que no es más que un método que recibe una entrada y devuelve una salida.

La magia de este concepto es que cuando lo combinamos con los objetos inmutables, conseguimos que para una entrada X tenemos la absoluta seguridad de que la salida será Y, SIEMPRE.

Esto nos permite, entre otras cosas, poder probar de manera rápida nuestras funciones si el lenguaje que estamos utilizando incorpora una consola REPL (Read Evaluate Print Loop), ya que una vez definida la función solamente tenemos que ejecutarla con los valores adecuados.

Los lenguajes funcionales no son algo solamente «académico»

Aunque los conceptos que nos muestren se acerquen bastante más a las matemáticas que a ensamblador, los ejemplos mostrados en aplicaciones móviles, sistemas cliente-servidor, arquitecturas funcionales y videojuegos, me dejaron bastante claro que la programación funcional está aquí para quedarse, y que ya estamos tardando, al menos, en aprender algunos de sus conceptos.

No tengo ni idea de lo que son las monads, creo.

Uno de los conceptos de programación funcional que se me escapa es el de las monads, que al parecer son tipos de datos con propiedades específicas, y uno de los ejemplos que veíamos en el evento era el del monad Either, que tiene dos tipos, Left o Right.

Con este monad podíamos definir el resultado de nuestra función, siendo Left un resultado de éxito, y Right una definición de un error, evitando flujos como captura de excepciones.

Este concepto tiene a su vez conceptos relacionados como monoids o functors… de los cuales tendré que leer, y mucho.

Podemos usar conceptos de programación funcional con lenguajes no puramente funcionales.

Conceptos como funciones puras u objetos inmutables son relativamente fáciles de implementar aunque los lenguajes no lo refuercen nativamente, sin embargo requiere un grado de disciplina mayor.

Sin embargo lenguajes como C# o Java van aportando cada vez más características de la programación funcional a su sintaxis, como las Lambdas y las colecciones inmutables. Aunque no es el escenario ideal para utilizar programación funcional, nos permite usar lo que ya sabemos.

Tenemos muchas maneras de empezar, aunque hay dos muy interesantes:

Por una parte tenemos lenguajes como Scala, en el que podemos desarrollar de la misma manera en la que lo veníamos haciendo hasta ahora, ya que soporta tanto tipos mutables como inmutables, e ir agregando características de la programación funcional a nuestros programas.

Por otra parte tenemos lenguajes F#, que nos permite lanzarnos al vacío, con una sintaxis que nos podría recordar cuando encadenamos la salida de distintos procesos en una shell de unix, que nos permite aprender programación funcional más «pura» y su interoperabilidad con C# nos permite agregar componentes funcionales a nuestro proyecto.

En resumen

Tenemos características como la inmutabilidad y las funciones puras que nos evitan sorpresas en nuestro código, podemos empezar migrando poco a poco a funcional o tirarnos a la piscina con lenguajes que solamente implementan este paradigma, y tenemos algo de soporte en nuestros lenguajes del día a día de algunos conceptos como las lambdas. Ha sido una experiencia muy enriquecedora, y espero veros en la siguiente edición de Lambda World

Vídeo y enlaces del hangout sobre programación funcional

El pasado 11 de marzo tuve la oportunidad de moderar hangout sobre algunas de las ventajas que nos aporta la programación funcional con experiencias en F#, Scala y Clojure con estos cracks

El vídeo del evento está disponible aquí:

Además, compartimos algunos enlaces sobre la diferentes herramientas, y he recopilado estos enlaces en la siguiente lista:

Haskell

F#

Scala

Clojure

La lista está disponible además en github , así que puedes contribuir y agregar tus propios enlaces mediante Pull Requests.

Nos vemos en el siguiente!

Hangout: Programación funcional #hablafuncional

Tengo el placer de invitarte a un nuevo hangout el próximo 11 de Marzo a las 20:00 (GMT+1) donde hablaremos de programación funcional tanto con F# como con otros lenguajes como Scala o Clojure, continuando la conversación de la pasada DotNetSpain Conference.

Esta vez, además, contamos con un panel de auténtico lujo, en el que repite (como no podía ser de otra manera) mi buen amigo Juan Quijano (@jc_quijano) como moderador, además de los siguientes invitados:

  • Alex Casquete (@acasquete): Coordinador del Meetup de F# en Barcelona.
  • Alfonso García (@alfonsogcnunez): Coordinador del Meetup de F# en Madrid.
  • Juanma Hernandez (@gulnor): Desarrollador de software con mucho interés en Clojure.
  • Javi Pacheco (@javielinux): Desarrollador Android y Scala en 47 Degrees.
  • Francisco Díaz (@francisco_dr): Desarrollador Android y Scala en 47 Degrees.
  • Juan Pedro Moreno (@juanpedromoreno): Desarrollador Senior Scala en 47 Degrees.
  • Juan M Gomez (@_jmgomez_): Desarrollador F#.

Durante un par de horas intentaremos responder a las siguientes preguntas (y todas las que tengas a través del hashtag #hablafuncional):

  • ¿Qué aporta (en general) la programación funcional?
  • ¿Cómo podríamos dar nuestros primeros pasos para pensar en funcional?
  • ¿Cuan sencillo resulta interoperar con otras plataformas, C# en el caso de F# y Java en el caso de Scala/Clojure?
  • ¿Qué requisitos adicionales tenemos para agregarlo a nuestro proyecto?

Inscríbete aquí: Programación Funcional con F# – Google Hangouts

Desde aquí un agradecimiento a todos por su interés en participar, a todos los que se han interesado vía Twitter, , en especial a Alex Campos por ponernos en contacto con los chicos de 47 Degrees para dar otra perspectiva a la programación funcional.