Currying în JavaScript

unul dintre principiile pe care fiecare programator încearcă să le respecte este uscat (nu vă repetați ), cu Currying vom vedea cum să facem acest lucru cu funcțiile noastre este destul de simplu și util.

acest conținut am publicat mai întâi în newsletter-ul meu, săptămâna după publicarea newsletter-ul public în blog-ul meu, dacă vrei să fii primul pentru a citi Aboneaza-te

postări Banner

modul în care scriem în mod normal funcțiile noastre este:

//ES2015const divisible = (num, mod) => num % mod;//ES5var divisible = function(num, mod) { return num % mod;}

pentru a executa această funcție trebuie să transmitem două argumente, dar dacă am dori să avem o funcție care verifică exclusiv dacă un număr este par, ar trebui să scriem o nouă funcție. În acest moment este util să aveți o funcție currificată.

Căci înainte de a înțelege cum funcționează o funcție currificată, trebuie să cunoaștem câteva concepte.

funcțiile sunt cetățeni de primă clasă, aceasta înseamnă că funcțiile sunt obiecte, le puteți transmite ca argumente, stocate în variabile și puteți reveni în alte funcții Funcții de înaltă ordine în JavaScript

o închidere este atunci când o funcție este capabilă să-și amintească și să acceseze un domeniu lexical, chiar și atunci când funcția este executată în afara domeniului lexical. Înțelegerea închideri în JavaScript

dacă o funcție primește mai mult de un parametru, acesta poate fi rescris ca, o funcție care ia un parametru și returnează o funcție, este la rândul său primește un parametru și returnează rezultatul. Calculez lambda în JavaScript

¿ce este Currying?

Curry poate apela o funcție cu mai puțini parametri decât se așteaptă, returnează o funcție care așteaptă parametrii rămași și returnează rezultatul.

în acest fel am putea rescrie funcția la început ca

//ES2015const divisible = mod => num => num % mod;//ES5var divisible = function (mod) { return function (num) { return num % mod; }}

pentru apelarea acestei funcții avem două opțiuni

  • treceți argumentele rulând funcțiile
divisible(10)(2)
  • trecerea unui argument și de a primi o funcție care amintesc acest argument
const divisibleEn3 = divisible(3);divisibleEn3(10)

așa cum am scrie o funcție currificada nu este complicat, dar s-ar putea face un pic mai natural ca funcție escribimoscualquier.

pentru aceasta putem folosi Lodash sau Ramda care au o metodă curry, care ne permite să currificăm orice funcție în acest fel.

import { __, curry, map } from 'ramda';const composeNombre = curry( (primer, apellido) => `${primer} ${apellido}`);const familiaJaimes = composeNombre(__, 'Jaimes')const nombres = console.log(map(familiaJaimes, nombres))

să ne uităm la un exemplu mai util luat de la ghid cea mai mare parte adecvate pentru programare funcțională

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();// 

avantajele Currying

  • putem crea noi funcții prin simpla trecere funcțiile noastre de bază cu unii parametri.
  • putem transforma orice funcție care funcționează cu un singur element într-una care funcționează cu o listă înfășurând-o într-o hartă.
  • puteți scrie bucăți mici de cod care sunt mai ușor de reutilizat.
  • este ușor să raționezi despre ele.
  • scrierea funcțiilor currified ne va permite să compunem funcții.



+