Un amigo mío y yo estábamos teniendo una discusión sobre el currying y la aplicación de funciones parciales en Javascript, y llegamos a conclusiones muy diferentes en cuanto a si alguno de los dos podía lograrse. Se me ocurrió con esta aplicación de Function.prototype.curry
, que fue la base de nuestra discusión:¿La "Aplicación de función parcial" es un nombre inapropiado en el contexto de Javascript?
Function.prototype.curry = function() {
if (!arguments.length) return this;
var args = Array.prototype.slice.apply(arguments);
var mmm_curry = this, args;
return function() {
var inner_args = Array.prototype.slice.apply(arguments);
return mmm_curry.apply(this, args.concat(inner_args));
}
}
que se utiliza de la siguiente manera:
var vindaloo = function(a, b) {
return (a + b);
}
var karahi = vindaloo.curry(1);
var masala = karahi(2);
var gulai = karahi(3);
print(masala);
print(other);
La salida de los cuales es el siguiente en Mono Araña:
$ js curry.js
3
4
Su opinión es que, dado que la primitiva Javascript function
no admite nativamente la "aplicación de función parcial", es completamente incorrecto referirse a la función n vinculado a la variable karahi
como parcialmente aplicado. Su argumento fue que cuando la función vindaloo
está al curry, la función en sí se aplica completamente y se devuelve un cierre, no una "función parcialmente aplicada".
Ahora, mi opinión es que si bien Javascript no proporciona soporte para la aplicación parcial en sus primitivas 'function
(a diferencia de, por ejemplo, ML o Haskell), eso no significa que no pueda crear una función de orden superior del lenguaje que es capaz de encapsular el concepto de una función parcialmente aplicada. Además, a pesar de ser "aplicado", el alcance de la función sigue estando vinculado al cierre devuelto, lo que hace que permanezca "parcialmente aplicado".
¿Cuál es la correcta?
Aviso [la diferencia entre currying y aplicación parcial] (https://en.wikipedia.org/wiki/Currying#Contrast_with_partial_function_application) – Bergi