Es "Parcial de la Función de la Aplicación de" un nombre poco apropiado en el contexto de Javascript?

StackOverflow https://stackoverflow.com/questions/92984

  •  01-07-2019
  •  | 
  •  

Pregunta

Un amigo mío y yo estábamos teniendo una discusión con respecto a alarmada y parcial de las funciones de la aplicación en Javascript, y llegamos a conclusiones muy diferentes en cuanto a si son alcanzables.Se me ocurrió con esta aplicación de Function.prototype.curry, que fue la base de nuestra discusión:

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);

El resultado de lo que es el siguiente en mono araña:

$ js curry.js
3
4

Su opinión era que, dado que el Javascript function primitivo no admite de forma nativa "de la función parcial de la aplicación", es completamente erróneo referirse a la función vinculado a la variable karahi como se aplica parcialmente.Su argumento fue que cuando la vindaloo la función es al curry, la función en sí es completamente aplicado y un cierre a la devuelve, no un "parcialmente aplicado a la función".

Ahora, mi opinión es que mientras que Javascript en sí no ofrece soporte para la aplicación parcial en su function primitivas (a diferencia de decir, ML o Haskell), eso no significa que usted no puede crear un orden superior función de la lengua que es capaz de encapsular concepto de un aplicó parcialmente la función.También, a pesar de ser "aplicado", el alcance de la función está todavía unido a la clausura devuelve haciéndolo permanecer "aplicado parcialmente".

Cual es la correcta?

¿Fue útil?

Solución

Técnicamente, usted está creando una nueva función que llama a la función original.Así que si mi entendimiento de que se aplica parcialmente las funciones es correcta, esto no es un aplicado parcialmente la función.Una que se aplica parcialmente la función estaría más cerca de este (tenga en cuenta que esto no es una solución general):

vindaloo.curry = function(a) {
    return function(b) {
        return a + b;
    };
};

IIUC, esto todavía no estaría parcialmente la función aplicada.Pero está más cerca.Una verdad que se aplica parcialmente la función sería en realidad este aspecto si usted puede examinar el código:

function karahi(b) {
    return 1 + b;
};

Así que, técnicamente, su método original es acaba de regresar de una función unido dentro de un cierre.La única manera que se me ocurre de verdad parcialmente aplicar una función en JavaScript sería analizar la función, aplicar los cambios y, a continuación, ejecute a través de un eval().

Sin embargo, su solución es una buena aplicación práctica del concepto de JavaScript, por lo que prácticamente hablando logra el objetivo, incluso si no es técnicamente exacto.

Otros consejos

Creo que es perfectamente bien para hablar de la función parcial de la aplicación en JavaScript - si funciona como aplicación parcial, entonces se debe ser uno.¿De qué otra manera iba a nombre de ella?

Cómo su curry la función alcanza su objetivo es simplemente una aplicación detalle.En una manera similar, podríamos tener aplicación parcial en la especificación ECMAScript, pero cuando IE pondrían en práctica como lo hizo, habría no hay manera de encontrar a cabo.

Los detalles técnicos no me importa - si la semántica siendo la misma y, para todos los intentos y propósitos, la función actúa como si fuera realmente una parte aplicada de la función, a quién le importa?

Yo solía ser como académico sobre las cosas, sino preocuparse de tales datos no reales de trabajo realizado en el final.

Personalmente, yo uso MochiKit;tiene un buen parcial() función que ayuda en la creación de tales.Me encanta.

Usted debe comprobar fuera de Curry De Las Funciones De JavaScript.No he envuelto mi cabeza alrededor de su curry función, pero podría tener su respuesta.

Editar:Yo estaría de acuerdo con su evaluación, sin embargo.

Su opinión era que, dado que la función de Javascript primitivo no admite de forma nativa "de la función parcial de la aplicación"

Usted puede hacer alarmada en ES6 bastante elegante:

> const add = a => b => a + b
> const add10 = add(10)
> [1,2,3].map(add10)
[ 11, 12, 13 ]
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top