web-dev-qa-db-fra.com

Un exemple concret d'utilisation de la fonction curry?

J'ai eu du mal à trouver un exemple concret d'utilisation de la fonction curry et à tirer parti de l'utilisation du curry.

Quand je google curry, je vois souvent l'exemple comme

let add = x => y => x + y;
let add10 = add(10);
console.log(add10(20));

Je dois dire que je ne vois vraiment pas la valeur de l'utilisation du curry dans cet exemple.

Après avoir lu les réponses dans ce SO https://stackoverflow.com/questions/113780/javascript-curry-what-are-the-practical-applications I ne voient toujours pas l'avantage de l'utiliser.

Par exemple, la réponse avec le score le plus élevé donne un exemple de convertisseur, mais cet exemple peut être réécrit sans curry comme le montre une autre réponse.

J'ai également lu les réponses Quel est l'avantage du curry? (bien que la discussion ne se limite pas au javascript) J'ai toujours le sentiment que la version curry peut être réécrite sans curry (en js).

Alors, quelqu'un peut-il me montrer le "vrai" avantage/avantage d'utiliser le curry en javascript?

---- mise à jour ----

Sauf pour les réponses que j'ai obtenues, je trouve également l'exemple de journal ici montre l'avantage de l'utiliser.

8
Qiulang

Je n'ai presque jamais utilisé Currying moi-même, mais voici un exemple récent où cela s'est avéré utile. Je codais pour le jeu Battlesnake , mais cela s'appliquerait à de nombreux jeux. Ils vous fournissent différents tableaux, donnant l'emplacement de votre serpent, des serpents ennemis et de la nourriture. Supposons que vous envisagiez de vous déplacer vers un certain point {x, y} et que vous souhaitiez vérifier s'il contient un autre serpent, de la nourriture ou même vous-même. La première passe serait d'écrire du code comme celui-ci (j'utiliserai un mélange de fonction et de nouvelles flèches fangled)

// utility function
function samePoint(p1, p2) {
  return (p1.x === p2.x) && (p1.y === p2.y);
}

et quelque part dans le code, allez

let possibleMove = {x,y}; // where you are thinking of moving
...
if (foodArray.some((p) => samePoint(p, possibleMove )) {
  // this move looks tasty, give it a bonus value...
}

Pas mal, mais, puisque vous ferez cela à de nombreux endroits dans votre code, un peu fastidieux et maladroit. Et, d'après mon expérience, facile de gâcher les deux arguments. :-( Le problème sous-jacent est que some() (ou find()) accepte une fonction ne prenant qu'un argument single, et vous vraiment besoin de deux arguments, les deux points. Alors, vous pensez au curry! Ici, beaucoup utiliseraient des flèches, je trouve les fonctions imbriquées plus claires:

function samePointAs(p1) {
  return function(p2) {
    return samePoint(p1, p2);
  }
}

Ensuite, votre test "est-ce que la nourriture" devient

let possibleMove = {x,y}; // where you are thinking of moving
...
if (foodArray.some(samePointAs(possibleMove )) {
  // this move looks tasty, give it a bonus value...
}

Est-ce que ça va faire de vous un millionnaire Internet? Probablement pas. Mais cela simplifie et, dans ce cas, clarifie votre code.

8
user949300

Curry dans votre exemple n'a pas vraiment de sens, je suis d'accord. Pour voir la fonctionnalité du curry, vous devez la combiner avec des fonctions d'ordre supérieur: des fonctions qui prennent une autre fonction en paramètre.

L'exemple le plus typique de ceci est mapper, filtrer et réduire, bien qu'une autre situation courante soit les rappels. Lorsque vous appliquez partiellement une fonction, vous pouvez transmettre la fonction partiellement appliquée à ces fonctions d'ordre supérieur. Le curry est logique lorsque la plupart du temps vous souhaitez utiliser une fonction est pour une application partielle afin qu'elle puisse être passée à une autre fonction d'ordre supérieur.

Un exemple plus illustratif pourrait ressembler à ceci:

let array1 = [1, 4, 9, 16];
let add = x => y => x + y;
array2 = array1.map(foo ? add(10) : add(20));

Le curry n'est jamais nécessaire, oui, car vous pouvez toujours créer une fonction anonyme/flèche à partir d'une fonction régulière lorsque vous en avez besoin, mais dans certaines situations, il peut être très pratique d'avoir une fonction curry par rapport à la fonction régulière (et dans d'autres situations, c'est juste rendre les choses ennuyeuses et lentes).

14
Lie Ryan