een van de principes waaraan elke programmeur probeert te voldoen is droog (herhaal jezelf niet ), met Currying zullen we zien hoe dit te doen met onze functies is vrij eenvoudig en nuttig.
Deze inhoud heb ik voor het eerst gepubliceerd in mijn nieuwsbrief, de week na de publicatie van de openbare nieuwsbrief in mijn blog, als u als eerste wilt lezen inschrijven
de manier waarop we normaal onze functies schrijven is:
//ES2015const divisible = (num, mod) => num % mod;//ES5var divisible = function(num, mod) { return num % mod;}
om deze functie uit te voeren moeten we twee argumenten passeren, maar als we een functie willen hebben die uitsluitend controleert of een getal gelijk is, moeten we een nieuwe functie schrijven. Op dit punt is het nuttig om een currified functie te hebben.
voordat we begrijpen hoe een currified functie werkt, moeten we enkele Concepten kennen.
functies zijn eersteklas burgers, dit betekent dat functies objecten zijn, u kunt ze doorgeven als argumenten, opgeslagen in variabelen, en retourneren binnen andere functies functies van hoge volgorde in JavaScript
een afsluiting is wanneer een functie in staat is om een lexicale scope te onthouden en toegang te krijgen, zelfs wanneer de functie buiten de lexicale scope wordt uitgevoerd. Sluitingen begrijpen in JavaScript
als een functie meer dan één parameter ontvangt, kan deze worden herschreven als, een functie die een parameter neemt en een functie retourneert, op zijn beurt een parameter ontvangt en het resultaat retourneert. Ik bereken lambda in JavaScript
¿Wat is Currying?
Curry kan een functie met minder parameters aanroepen dan verwacht, het geeft een functie terug die wacht op de resterende parameters en het resultaat retourneert.
deze manier konden we herschrijven van de functie aan het begin als
//ES2015const divisible = mod => num => num % mod;//ES5var divisible = function (mod) { return function (num) { return num % mod; }}
Voor het aanroepen van deze functie hebben we twee opties
- Pas de argumenten door het uitvoeren van de functies
divisible(10)(2)
- het Passeren van een argument en ontvang een functie die onthoud dit argument
const divisibleEn3 = divisible(3);divisibleEn3(10)
Als we schrijven een functie currificada is niet ingewikkeld, maar we kunnen doen een beetje meer natuurlijk als escribimoscualquier functie.
hiervoor kunnen we Lodash of Ramda gebruiken die een curry methode hebben, die ons in staat stelt om elke functie op deze manier te currifyeren.
import { __, curry, map } from 'ramda';const composeNombre = curry( (primer, apellido) => `${primer} ${apellido}`);const familiaJaimes = composeNombre(__, 'Jaimes')const nombres = console.log(map(familiaJaimes, nombres))
laten we eens kijken naar een meer nuttig voorbeeld genomen van meestal adequate Gids Voor functionele programmering
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();//
voordelen van Currying
- we kunnen nieuwe functies creëren door simpelweg onze basisfuncties met enkele parameters door te geven.
- we kunnen elke functie die werkt met een enkel element omzetten in een functie die werkt met een lijst door het in een kaart te wikkelen.
- u kunt kleine stukjes code schrijven die gemakkelijker te hergebruiken zijn.
- het is gemakkelijk om over hen te redeneren.
- het schrijven van currified functions zal ons toelaten om functies samen te stellen.