The Amazing World of Functional Programming

Or... why Immutable Data matter?

Los lenguajes funcionales no son algo nuevo, pero cada vez está mas en boca de los programadores que hace unos ayeres. Cuando se habla de lenguajes funcionales, siempre salen a la luz conceptos como “immutable data”, “first class functions”, “tail call optimisation”, currying, entre otras hierbas.

Inmutable data es aquél dato que no se puede cambiar. Cualquier operación de “mutación” copia el valor, lo cambia y regresa la copia. Esto elimina los errores que surgen de un modelo incompleto al alterar los posibles estados de un sistema. Aquellos lenguajes que soportan first class functions permiten a las funciones ser tratados como otro valor, es decir, pueden ser creados, pasados como argumentos, ser retornados por una función o almacenados dentro de cualquier estructura de datos.

En los lenguajes de programación, cada vez que una función recursiva es ejecutada se crea un nuevo stack de memoria. Éste stack se utiliza para almacenar los argumentos y valores locales para la invocación de la función actual. Si una función recursiva se llama un gran número de veces, es posible que el intérprete/compilador se quede sin memoria. Allí es donde el Tail call optimisation entra al rescate reutilizando el mismo stack para todas llamadas recursivas.

Currying descompone una función que toma varios argumentos en una función que toma el primer argumento y regresa una función que tomará el siguiente argumento, y así sucesivamente para los argumentos restantes.

Mas despacio cerebrito

Ok, en resumen, el código funcional se caracteriza por una sencilla cosa: la ausencia de efectos secundarios. Esto en cristiano significa que no cambian los datos que existen fuera de la función actual. Cada hierba “funcional” que se van a encontrar allí fuera se deriva de esta propiedad. Los programas funcionales están construidos en su mayoría con funciones pequeñas, reusables y predecibles.

Pure functions

Las funciones puras son aquellas sin efectos secundarios quienes dependen solamente de las entradas de la función, mientras que la salida debe ser exactamente el mismo para la misma entrada. Es gracias a ésta propiedad que son una excelente opción para operar en conjuntos de datos continuos.

var obj = { a: 1 };

function impureFunction(obj) {
  var b = 1;

  obj.a = obj.a * b + 2;

  return obj.a;
}

var c = impureFunction( values );
// obj.a es 3, impureFunction la ha mutado :(

var obj2 = { a: 1 };

function pureFunction ( a ) {
  var b = 1;

  a = a * b + 2;

  return a;
}

var d = pureFunction( obj2.a );
// obj2.a sigue siendo el valor con el que inició :D

Monads, Functors

Monads y Functors suenan geniales y cosas sacadas de un libro de ciencia ficción, pero su concepto no es más allá de lo que quizá ya hayan utilizado. Functors son aquellos objetos que tienen una función map. Map toma una función y una colección de artículos. El resultado es una nueva colección en el que cada elemento de la colección original es recorrida y retorna el valor transformado por la función. Monads -no confundir con Monado de shulk- son aquellos objetos que implementan flatmap. FlatMap acopla una colección anidada, “aplanandola” en un solo nivel.

var numbers = [1, 4, 9];
var roots = numbers.map(Math.sqrt);

// roots == [1, 2, 3] || numbers == [1, 4, 9]

/* 
En Js no existe flat_map. 
Podemos crearlo (cosa que haremos en otro post).
Por el bien del código, diremos que ya lo hicimos.
*/

var flatten = [[1,2],[3,4]].flat_map((i) => i)
// flatten == [1,2,3,4]
// Ahora flatten tiene el array en un sólo nivel :D

¿Ahora qué?

Functional programming es un paradigma con un estilo muy interesante y palabras rebuscadas que, después de enfrentarse a ellas, son más de lo mismo. Aquello con lo que trabajamos día a día. Hoy en día hay bastantes lenguajes que están enfocandose en ésta ideología, en juntar lo mejor del mundo OOP y FP. El presente es FP, y aún estamos a tiempo de subirnos al tren del hype.

En lo personal estoy muy emocionado con FP y mas ahora que existe el nuevo actor principal llamado Functional Reactive Programming, de quien por supuesto estaré escribiendo.

Recuerda que hay una sección de comentarios y por cada comentario el gato del blog se pondrá a rodar.

Nos leemos