Currying i JavaScript

en av principerna som varje programmerare försöker följa är torr (upprepa inte dig själv ), med Currying kommer vi att se hur man gör detta med våra funktioner är ganska enkelt och användbart.

detta innehåll jag publicerade först i mitt nyhetsbrev, veckan efter publicering av det offentliga nyhetsbrevet i min blogg, om du vill vara den första att läsa prenumerera

Bannerinlägg

hur vi normalt skriver våra funktioner är:

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

för att utföra denna funktion måste vi skicka två argument, men om vi ville ha en funktion som uteslutande kontrollerar om ett nummer är jämnt skulle vi behöva skriva en ny funktion. Vid denna tidpunkt är det användbart att ha en currified funktion.

för innan vi förstår hur en currified-funktion fungerar måste vi känna till några begrepp.

funktioner är förstklassiga medborgare, det betyder att funktioner är objekt, du kan skicka dem som argument, lagras i variabler och returnera inom andra funktioner Funktioner med hög ordning i JavaScript

en stängning är när en funktion kan komma ihåg och komma åt ett lexiskt omfång, även när funktionen körs utanför det lexikala omfånget. Förstå stängningar i JavaScript

om en funktion tar emot mer än en parameter kan den skrivas om som en funktion som tar en parameter och returnerar en funktion, får i sin tur en parameter och returnerar resultatet. Jag beräknar lambda i JavaScript

¿Vad är Currying?

Curry kan anropa en funktion med färre parametrar än den förväntar sig, den returnerar en funktion som väntar på de återstående parametrarna och returnerar resultatet.

på så sätt kan vi skriva om funktionen till början som

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

för att ringa den här funktionen har vi två alternativ

  • skicka argumenten genom att köra funktionerna
divisible(10)(2)
  • skicka ett argument och få en funktion som kommer ihåg detta argument
const divisibleEn3 = divisible(3);divisibleEn3(10)

när vi skriver en funktion currificada är inte komplicerat, men vi kan göra det lite mer naturligt som escribimoscualquier funktion.

för detta kan vi använda Lodash eller Ramda som har en currymetod, vilket gör att vi kan currify någon funktion på detta sätt.

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

Låt oss titta på ett mer användbart exempel från mestadels adekvat guide till funktionell 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();// 

fördelar med Currying

  • vi kan skapa nya funktioner genom att helt enkelt passera våra basfunktioner med vissa parametrar.
  • vi kan omvandla alla funktioner som fungerar med ett enda element till en som fungerar med en lista genom att linda in den i en karta.
  • du kan skriva små bitar av kod som är lättare att återanvända.
  • det är lätt att resonera om dem.
  • skriva currified funktioner gör att vi kan komponera funktioner.



+