Pointfree Javascript con RamdaJS

http://rockalabs.com/ 

LET'S BUILD TOGETHER

¿Qué es la programación funcional?

LET'S BUILD TOGETHER

Es un paradigma de programación declarativa.

 

El objetivo es conseguir lenguajes expresivos y matemáticamente elegantes

 

Transparencia referencial.

 

Funciones de primera clase y de orden superior.

Funciones de primera clase y funciones puras

LET'S BUILD TOGETHER

Las funciones de primera clase son funciones que se tratan como cualquier otro tipo de dato.

 

Una función es pura, cuando dado un dato de entrada siempre tiene una misma salida y  no tienen ningún efecto secundario.

LET'S BUILD TOGETHER

¿Qué currying?

Es un concepto simple, puedes llamar una función con menos argumentos de los que espera y me devolverá una función que toma el resto de los argumentos.

var add = function(x) {
  return function(y) {
    return x + y;
  };
};

var increment = add(1);
var addTen = add(10);

increment(2);
// 3
addTen(2);
// 12

LET'S BUILD TOGETHER

var R = require('ramda');
var curry = R.curry;

var match = curry(function(what, str) {
  return str.match(what);
});

var filter = curry(function(f, ary) {
  return ary.filter(f);
});

match(/\s+/g, 'hello world'); // [ ' ' ]

match(/\s+/g)('hello world'); // [ ' ' ]

var hasSpaces = match(/\s+/g);
// function(x) { return x.match(/\s+/g) }

hasSpaces('hello world'); // [ ' ' ]

hasSpaces('spaceless'); // null

filter(hasSpaces, ['tori_spelling', 'tori amos']); // ['tori amos']

var findSpaces = filter(hasSpaces);
// function(xs) { return xs.filter(function(x) { return x.match(/\s+/g) }) }

findSpaces(['tori_spelling', 'tori amos']); // ['tori amos']

LET'S BUILD TOGETHER

¿Qué es composing?

La composición conecta nuestras funciones como 'pipes', la entrada de una es la salida de otra.

var compose = function(f, g) {
  return function(x) {
    return f(g(x));
  };
};

var toUpperCase = function(x) {
  return x.toUpperCase();
};
var exclaim = function(x) {
  return x + '!';
};
var shout = compose(exclaim, toUpperCase);

shout("i love javascript");
//=> "I LOVE JAVASCRIPT!"

LET'S BUILD TOGETHER

En composición el orden importa, es como la matemática.

Es un flujo de derecha a izquierda.

Existe una alternativa llamada 'pipe'.

La composición es asociativa,

compose(f, compose(g, h)) == compose(compose(f, g), h)

No hay manera correcta o incorrecta, podemos usar nuestras funciones como 'legos' y combinarlos como sea que queramos.

LET'S BUILD TOGETHER

Pointfree

Pointfree es un estilo de programación, significa que las funciones no mencionan los datos con los que operan.

//sin pointfree, se menciona: word
var snakeCase = function(word) {
  return word.toLowerCase().replace(/\s+/ig, '_');
};

//pointfree
var snakeCase = compose(replace(/\s+/ig, '_'), toLowerCase);


//sin pointfree, se menciona: name
var initials = function(name) {
  return name.split(' ').map(compose(toUpperCase, head)).join('. ');
};

//pointfree
var initials = compose(join('. '), map(compose(toUpperCase, head)), split(' '));

LET'S BUILD TOGETHER

Pointfree puede reducir funciones, simplificar código y mantener nombres cortos y concisos .

Pero cuidado puede llegar a ser un arma de doble filo y a veces puede terminar complicando el código o volviéndolo mas confuso.
No todo el código puede ni debe ser Pointfree, pero es una buena práctica en muchas ocasiones.

LET'S BUILD TOGETHER

http://rockalabs.com

@alsug4

Alejandro Suárez

CONVERSATIONAL INTERFACES DEVELOPER

Made with Slides.com