Is & # 8220; Application de fonction partielle & # 8221; un abus de langage dans le contexte de Javascript?

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

  •  01-07-2019
  •  | 
  •  

Question

Un de mes amis et moi avons eu une discussion concernant le currying et l’application de fonctions partielles en Javascript, et nous sommes parvenus à des conclusions très différentes quant à la possibilité de réaliser l’un ou l’autre. Je suis arrivé avec cette implémentation de Function.prototype.curry , qui était la base de notre discussion:

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

}

Qui est utilisé comme suit:

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 sortie de Spidermonkey est la suivante:

$ js curry.js
3
4

À son avis, comme la primitive de fonction de Javascript ne prend pas nativement en charge "application de fonction partielle", il est totalement erroné de faire référence à la fonction liée à la variable karahi comme partiellement appliqué. Son argument était que, lorsque la fonction vindaloo est curry, la fonction elle-même est complètement appliquée et une fermeture est renvoyée, et non une "fonction partiellement appliquée".

Mon opinion est que, même si Javascript ne prend pas en charge l'application partielle dans ses primitives function (contrairement à ML ou Haskell), cela ne signifie pas que vous ne pouvez pas créer une fonction d'ordre supérieur du langage capable d'encapsuler le concept d'une fonction partiellement appliquée. De même, bien qu’elle soit "appliquée", la portée de la fonction est toujours liée à la fermeture renvoyée par celle-ci, de sorte qu'elle reste "partiellement appliquée".

Lequel est correct?

Était-ce utile?

La solution

Techniquement, vous créez une nouvelle fonction qui appelle la fonction d'origine. Donc, si ma compréhension des fonctions partiellement appliquées est correcte, il ne s’agit pas d’une fonction partiellement appliquée. Une fonction partiellement appliquée serait plus proche de ceci (notez qu'il ne s'agit pas d'une solution générale):

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

IIUC, ce ne serait toujours pas une fonction partiellement appliquée. Mais c'est plus proche. Une vraie fonction partiellement appliquée ressemblerait à ceci si vous pouviez examiner le code:

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

Donc, techniquement, votre méthode originale consiste à renvoyer une fonction liée dans une fermeture. Le seul moyen auquel je puisse penser pour vraiment appliquer partiellement une fonction en JavaScript serait d'analyser la fonction, d'appliquer les modifications, puis de l'exécuter avec eval ().

Cependant, votre solution constitue une bonne application pratique du concept à JavaScript. Ainsi, l'objectif est pratiquement atteint, même s'il n'est pas techniquement exact.

Autres conseils

Je pense qu'il est parfaitement correct de parler d'application partielle en JavaScript - si cela fonctionne comme une application partielle, alors il doit être une. Sinon, comment l'appelleriez-vous?

Comment votre fonction curry réalise-t-elle son objectif n'est-il qu'une implémentation? détail. De la même manière, nous pourrions avoir une application partielle dans la spécification ECMAScript, mais quand IE le mettrait en œuvre comme vous l'avez fait, vous auriez aucun moyen de le savoir.

Les détails techniques ne m'importent pas - si la sémantique reste la même et, à toutes fins utiles, si la fonction agit comme s'il s'agissait vraiment d'une fonction partiellement appliquée, on s'en fiche.

Auparavant, j'étais un universitaire très académique, mais l'inquiétude que suscitent de tels détails ne fait pas vraiment avancer le travail.

Personnellement, j'utilise MochiKit ; il a une belle fonction partial () qui aide à la création de tels. Je l'aime.

Vous devriez vérifier les Fonctions JavaScript curryisées . Je n’ai pas encore complètement assimilé sa fonction curry, mais votre réponse pourrait être utile.

Edit: Je suis d'accord avec votre évaluation, cependant.

  

Selon lui, étant donné que la primitive de fonction Javascript ne prend pas nativement en charge une "application de fonction partielle",

Vous pouvez faire le curry dans ES6 assez élégamment:

> const add = a => b => a + b
> const add10 = add(10)
> [1,2,3].map(add10)
[ 11, 12, 13 ]
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top