Uno dei principi che ogni programmatore cerca di rispettare è ASCIUTTO (Non ripetere te stesso ), con Currying vedremo come farlo con le nostre funzioni è abbastanza semplice e utile.
Questo contenuto che ho pubblicato per primo nella mia newsletter, la settimana dopo la pubblicazione della newsletter pubblica nel mio blog, se vuoi essere il primo a leggere iscriviti
Il modo in cui normalmente scriviamo le nostre funzioni è:
//ES2015const divisible = (num, mod) => num % mod;//ES5var divisible = function(num, mod) { return num % mod;}
Per eseguire questa funzione dobbiamo passare due argomenti, ma se volessimo avere una funzione che controlla esclusivamente se un numero è pari dovremmo scrivere una nuova funzione. A questo punto è utile avere una funzione currified.
Per prima di capire come funziona una funzione currified dobbiamo conoscere alcuni concetti.
funzioni sono cittadini di prima classe, questo significa che le funzioni sono oggetti, si può passare come argomenti, memorizzati in variabili, e ritorno all’interno di altre funzioni Funzioni di ordine elevato in JavaScript
chiusura è quando una funzione è in grado di ricordare e di accesso alla scope lessicale, anche quando la funzione viene eseguita al di fuori dell’ambito lessicale. Comprendere le chiusure in JavaScript
Se una funzione riceve più di un parametro, può essere riscritta come, una funzione che prende un parametro e restituisce una funzione, è a sua volta riceve un parametro e restituisce il risultato. Calcolo lambda in JavaScript
¿Che cosa è Currying?
Curry è in grado di chiamare una funzione con meno parametri di quanto si aspetti, restituisce una funzione che attende i parametri rimanenti e restituisce il risultato.
in questo modo si potrebbe riscrivere la funzione per l’inizio, come
//ES2015const divisible = mod => num => num % mod;//ES5var divisible = function (mod) { return function (num) { return num % mod; }}
Per la chiamata a questa funzione, abbiamo due opzioni
- Passare gli argomenti per l’esecuzione di funzioni
divisible(10)(2)
- il Passaggio di un argomento e ricevere una funzione che ricorda questo argomento
const divisibleEn3 = divisible(3);divisibleEn3(10)
Come si scrive una funzione currificada non è complicato, ma possiamo farlo un po ‘ più naturale, come escribimoscualquier funzione.
Per questo possiamo usare Lodash o Ramda che hanno un metodo curry, che ci permette di currify qualsiasi funzione in questo modo.
import { __, curry, map } from 'ramda';const composeNombre = curry( (primer, apellido) => `${primer} ${apellido}`);const familiaJaimes = composeNombre(__, 'Jaimes')const nombres = console.log(map(familiaJaimes, nombres))
Diamo un’occhiata a un esempio più utile tratto dalla guida per lo più adeguata alla programmazione funzionale
import { curry } from 'ramda';// Estas funciones las puedes conseguir dentro de Ramda o Lodashvar match = curry(function(what, str) { return str.match(what);});var replace = curry(function(what, replacement, str) { return str.replace(what, replacement);});var filter = curry(function(f, ary) { return ary.filter(f);});var map = curry(function(f, ary) { return ary.map(f);});var hasSpaces = match(/\s+/g);hasSpaces("hello world");// hasSpaces("spaceless");// nullfilter(hasSpaces, );// var findSpaces = filter(hasSpaces);// function(xs) { return xs.filter(function(x) { return x.match(/\s+/g) }) }findSpaces();//
Vantaggi di Currying
- possiamo creare nuove funzioni semplicemente passando le nostre funzioni di base con alcuni parametri.
- Possiamo trasformare qualsiasi funzione che funzioni con un singolo elemento in una che funzioni con una lista avvolgendola in una mappa.
- È possibile scrivere piccoli pezzi di codice che sono più facili da riutilizzare.
- È facile ragionare su di loro.
- Scrivere funzioni currified ci permetterà di comporre funzioni.