Sur le curry

Au cours du mois dernier, j'ai compris et oublié les subtilités des fonctions de curry à quelques reprises, alors voici un article rapide qui couvrira le concept en général.

Avant d'entrer dans le vif du sujet, sachez que le currying est très utilisé en programmation fonctionnelle, et qu'il repose sur le concept de fonctions d'ordre supérieur , c'est-à-dire le passage d'une fonction à une autre. Si cela vous semble déroutant, consultez la lecture rapide sur ce concept que j'ai écrite ici . C'est une lecture de 3 minutes pour vous mettre au courant.

Bien que le fait de curry les fonctions tire son nom de Haskell Curry, cela m'a aidé à y penser comme si je faisais un curry. Traditionnellement, lorsque vous appelez une fonction, vous transmettez tous ses arguments en même temps, et la fonction renvoie votre résultat. Lorsque vous curry une fonction, la fonction est divisée en fonctions partielles et elle prend ses arguments un à la fois , en passant le premier argument à la première fonction partielle. Lorsque le premier partiel revient, la fonction curry prendra l'argument suivant, et ainsi de suite, jusqu'à ce qu'il n'y ait plus d'arguments à traiter. Ajoutez un argument et laissez mijoter. Lorsqu'il est prêt, ajoutez l'argument suivant. C'est un peu comme cuisiner un curry.

D'accord, c'est beaucoup à déballer là. Ne paniquez pas . C'est un concept simple et en quelques minutes, vous aurez également le coup de main. Consultez les exemples de codage ci-dessous.

Ce mec a fait un méchant Aloo Gobi récursif

Regardons donc cette fonction madlibs, écrite traditionnellement, ci-dessous.

let madlibs = (name, food, number) => 
  'My name is ' + name +
  ' and I love ' + food +
  ', I could eat ' + number +' plates of it!'

console.log (madlibs("Jerry","Spaghetti","10"))

My name is Jerry and I love Spaghetti, I could eat 10 plates of it!

let madlibs = 
  name => 
    food => 
      number => 
        'My name is ' + name +
          ' and I love ' + food +
            ', I could eat ' + number +' plates of it!'

console.log (madlibs("Jerry")("Spaghetti")("10"))

My name is Jerry and I love Spaghetti, I could eat 10 plates of it!

console.log (madlibs("Jerry")("Spaghetti"))

(number) => 'My name is ' + name + ' and I love ' + food + ', I could eat ' + number + ' plates of it!'

La chose importante à noter ici est de savoir comment le curry nous donne la possibilité d'ajouter lentement nos arguments à notre fonction. Bien que la raison ne soit pas encore évidente , le fait que nous puissions passer progressivement des arguments et revenir à notre fonction plus tard avec plus d'arguments est utile, nous reviendrons sur ce concept sous peu.

Mais avant de faire cela, une dernière chose que vous devez savoir est que nous pouvons utiliser un certain nombre de bibliothèques de programmation fonctionnelles pour que JavaScript curry une fonction traditionnelle pour nous, par exemple lodash:

import _ from 'lodash'
let madlibs = (name, food, number) =>
  'My name is ' + name +
  ' and I love ' + food +
  ', I could eat ' + number +' plates of it!'
madlibs = _.curry(madlibs)
let jerry = madlibs("Jerry")
let jerrysFavoriteFood = jerry("Spaghetti")
console.log (jerrysFavoriteFood('10'))

let jerry = madlibs("Jerry")

My name is Jerry and I love Spaghetti, I could eat 10 plates of it!

let users = [
{id: 1, username: "cambot", favorite_color: "red"},
{id: 2, username: "gypsy", favorite_color: "purple"},
{id: 3, username: "tom", favorite_color:  "red"},
{id: 4, username: "crow", favorite_color: "gold"},
{id: 5, username: "joel", favorite_color: "red"},
{id: 6, username: "mike", favorite_color: "blue"},
{id: 7, username: "jonah", favorite_color: "yellow"}
]
let faveColor = (favorite_color, obj) => obj.favorite_color === favorite_color
let usersThatLoveRed = users.filter(x => faveColor('red', x))
console.log(usersThatLoveRed)

[
{id:1,username:"cambot",favorite_color:"red"},{id:3,username:"tom",favorite_color:"red"},{id:5,username:"joel",favorite_color:"red"}
]

Cela fonctionne, mais regardez la façon dont nous appelons faveColor. On lui passe 2 arguments, 'red’et x. En utilisant le curry, nous pouvons rendre le code plus lisible. Dans l'exemple ci-dessous, nous obtenons le même résultat :

import _ from 'lodash'
let users = [
{id: 1, username: "cambot", favorite_color: "red"},
{id: 2, username: "gypsy", favorite_color: "purple"},
{id: 3, username: "tom", favorite_color:  "red"},
{id: 4, username: "crow", favorite_color: "gold"},
{id: 5, username: "joel", favorite_color: "red"},
{id: 6, username: "mike", favorite_color: "blue"},
{id: 7, username: "jonah", favorite_color: "yellow"}
]
let faveColor = _.curry((favorite_color, obj) => obj.favorite_color === favorite_color)
let usersThatLoveRed = users.filter(faveColor('red'))
console.log(usersThatLoveRed)

Et vraiment, c'est de cela qu'il s'agit

  • Soit à la main, soit en utilisant une bibliothèque fonctionnelle comme lodash, nous prenons une fonction qui prend plusieurs arguments et la divisons en fonctions partielles qui prennent des arguments uniques
  • Les partiels que nous appelons renvoient les partiels qui n'ont pas encore été exécutés. Nous _pouvons_ appeler toutes ces fonctions en un seul appel, ou seulement les partiels que nous devons utiliser.
Attrapez-vous la prochaine fois !

Suggested posts

Mes ressources de codage les plus utilisées

Mes ressources de codage les plus utilisées

Cette semaine, j'ai reçu un e-mail d'un membre de la liste de diffusion quotidienne. Ils voulaient savoir : Quelles ressources consultez-vous quotidiennement, hebdomadairement et mensuellement ? Grande question ! Je suis heureux d'essayer de partager quelques idées sur mon flux de travail et les principales ressources que j'utilise.

Série de bibliothèques Lit — 1 : Une plongée en profondeur dans la bibliothèque lit-html

Série de bibliothèques Lit — 1 : Une plongée en profondeur dans la bibliothèque lit-html

Le but de cette série de blogs est d'approfondir la bibliothèque Lit et d'acquérir une compréhension complète de ses caractéristiques uniques et de la manière dont elle se distingue des autres bibliothèques et frameworks du marché. La série est divisée en trois parties, couvrant des sujets tels que 1.

Related posts

Suivre n'importe qui avec juste un numéro de téléphone | Enquête OSINT

Suivre n'importe qui avec juste un numéro de téléphone | Enquête OSINT

Vous pouvez être un enquêteur OSINT, un joueur CTF ou simplement quelqu'un qui reçoit des appels de spam. Quelqu'un qui essaie de vérifier le numéro que vous avez vu dans une publicité.

Learning at Work Week compte plus que vous ne le pensez

Learning at Work Week compte plus que vous ne le pensez

Nous avons souvent du mal à mettre en œuvre ce que nous savons être bon pour nous. Qu'il s'agisse de dire à un proche que nous l'aimons ou de se rappeler de parler comme un pirate, il y aura toujours ceux qui prétendent qu'un jour, une semaine ou un mois d'événements ne sont pas nécessaires parce qu'ils font déjà ces choses.

Plus de mots de passe - comment les clés d'accès remplaceront votre mot de passe

Plus de mots de passe - comment les clés d'accès remplaceront votre mot de passe

Pour éviter toute ambiguïté, les termes suivants seront utilisés ; Authentificateur ; Le téléphone mobile utilisé pour effectuer la connexion au site Web ; Le site Web ou l'application que l'utilisateur utilise pour effectuer la demande de connexion au service ; Le fournisseur fournissant le service donné, par exemple

Pourquoi certains freelances simulent leur vie

Pourquoi certains freelances simulent leur vie

J'étais récemment sur Linkedin, le plus grand réseau social professionnel au monde, et j'ai trouvé des messages de designers indépendants que je suis et qui ont attiré mon attention. Ils ont tous posté des photos d'avions, sur la plage avec leurs ordinateurs portables, de piscines et de bureaux avec une vue imprenable.