et af de principper, som enhver programmør søger at overholde, er tør (gentag ikke dig selv), med Currying vil vi se, hvordan man gør dette med vores funktioner er ret simpelt og nyttigt.
dette indhold offentliggjorde jeg først i mit nyhedsbrev, ugen efter udgivelsen af det offentlige nyhedsbrev i min blog, hvis du vil være den første til at læse abonner
den måde, vi normalt skriver vores funktioner på, er:
//ES2015const divisible = (num, mod) => num % mod;//ES5var divisible = function(num, mod) { return num % mod;}
for at udføre denne funktion skal vi videregive to argumenter, men hvis vi ville have en funktion, der udelukkende kontrollerer, om et tal er ens, skulle vi skrive en ny funktion. På dette tidspunkt er det nyttigt at have en currified funktion.
for før vi forstår, hvordan en currified funktion fungerer, skal vi kende nogle begreber.
funktioner er førsteklasses borgere, det betyder, at funktioner er objekter, du kan videregive dem som argumenter, gemt i variabler og returnere inden for andre funktioner Funktioner af høj orden i JavaScript
en lukning er, når en funktion er i stand til at huske og få adgang til et leksikalsk omfang, selv når funktionen udføres uden for det leksikalske omfang. Forståelse af lukninger i JavaScript
hvis en funktion modtager mere end en parameter, kan den omskrives som en funktion, der tager en parameter og returnerer en funktion, modtager igen en parameter og returnerer resultatet. Jeg beregner lambda i JavaScript
¿Hvad er Currying?
Curry er i stand til at kalde en funktion med færre parametre, end den forventer, den returnerer en funktion, der venter på de resterende parametre og returnerer resultatet.
på denne måde kunne vi omskrive funktionen til begyndelsen som
//ES2015const divisible = mod => num => num % mod;//ES5var divisible = function (mod) { return function (num) { return num % mod; }}
for at kalde denne funktion har vi to muligheder
- Pass argumenterne ved at køre funktionerne
divisible(10)(2)
- passerer et argument og modtager en funktion, der husker dette argument
const divisibleEn3 = divisible(3);divisibleEn3(10)
som vi skriver en funktion currificada er ikke kompliceret, men vi kan gøre det lidt mere naturligt som escribimoscualker funktion.
til dette kan vi bruge Lodash eller Ramda, der har en curry-metode, som giver os mulighed for at currify enhver funktion på denne måde.
import { __, curry, map } from 'ramda';const composeNombre = curry( (primer, apellido) => `${primer} ${apellido}`);const familiaJaimes = composeNombre(__, 'Jaimes')const nombres = console.log(map(familiaJaimes, nombres))
lad os se på et mere nyttigt eksempel taget fra det meste passende guide til funktionel 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();//
fordele ved Currying
- vi kan oprette nye funktioner ved blot at passere vores basisfunktioner med nogle parametre.
- vi kan omdanne enhver funktion, der fungerer med et enkelt element, til en, der fungerer med en liste ved at indpakke den på et kort.
- du kan skrive små stykker kode, der er lettere at genbruge.
- det er let at begrunde dem.
- skrivning af currified-funktioner giver os mulighed for at komponere funktioner.