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.
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.
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
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']
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!"
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.
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(' '));
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.
http://rockalabs.com
@alsug4