You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardexpand all lines: 1-js/99-js-misc/03-currying-partials/article.md
+55-55
Original file line number
Diff line number
Diff line change
@@ -5,19 +5,19 @@ libs:
5
5
6
6
# Currying
7
7
8
-
[Currying](https://en.wikipedia.org/wiki/Currying)is an advanced technique of working with functions. It's used not only in JavaScript, but in other languages as well.
8
+
[Currying](https://en.wikipedia.org/wiki/Currying)este o tehnică avansată de lucru cu funcții. Este utilizată nu numai în JavaScript, dar și în alte limbaje.
9
9
10
-
Currying is a transformation of functions that translates a function from callable as `f(a, b, c)`into callable as`f(a)(b)(c)`.
10
+
Currying este o transformare a funcțiilor care transpune o funcție apelabilă ca `f(a, b, c)`în apelabilă ca`f(a)(b)(c)`.
11
11
12
-
Currying doesn't call a function. It just transforms it.
12
+
Currying nu apelează o funcție. Pur și simplu o transformă.
13
13
14
-
Let's see an example first, to better understand what we're talking about, and then practical applications.
14
+
Să vedem mai întâi un exemplu, pentru a înțelege mai bine despre ce vorbim, și apoi aplicațiile practice.
15
15
16
-
We'll create a helper function`curry(f)`that performs currying for a two-argument`f`. In other words, `curry(f)`for two-argument `f(a, b)`translates it into a function that runs as`f(a)(b)`:
16
+
Vom crea o funcție ajutătoare`curry(f)`care realizează currying pentru o funcție`f` cu două argumente. Cu alte cuvinte, `curry(f)`pentru `f(a, b)`cu două argumente îl traduce într-o funcție care se execută ca`f(a)(b)`:
17
17
18
18
```js run
19
19
*!*
20
-
functioncurry(f) { // curry(f) does the currying transform
20
+
functioncurry(f) { // curry(f) face transformarea currying
21
21
returnfunction(a) {
22
22
returnfunction(b) {
23
23
returnf(a, b);
@@ -26,7 +26,7 @@ function curry(f) { // curry(f) does the currying transform
26
26
}
27
27
*/!*
28
28
29
-
//usage
29
+
//utilizare
30
30
functionsum(a, b) {
31
31
return a + b;
32
32
}
@@ -36,84 +36,84 @@ let curriedSum = curry(sum);
36
36
alert( curriedSum(1)(2) ); // 3
37
37
```
38
38
39
-
As you can see, the implementation is straightforward: it's just two wrappers.
39
+
După cum puteți vedea, implementarea este directă: este vorba doar de două învelișuri.
40
40
41
-
-The result of `curry(func)`is a wrapper`function(a)`.
42
-
-When it is called like `curriedSum(1)`, the argument is saved in the Lexical Environment, and a new wrapper is returned`function(b)`.
43
-
-Then this wrapper is called with`2`as an argument, and it passes the call to the original `sum`.
41
+
-Rezultatul lui `curry(func)`este un înveliș`function(a)`.
42
+
-Atunci când este apelat ca `currySum(1)`, argumentul este salvat în mediul lexical și se returnează un nou înveliș`function(b)`.
43
+
-Apoi, acest înveliș este apelat cu`2`ca argument, iar apelul este transmis către `sum` original.
44
44
45
-
More advanced implementations of currying, such as [_.curry](https://lodash.com/docs#curry)from lodash library, return a wrapper that allows a function to be called both normally and partially:
45
+
Implementările mai avansate de currying, cum ar fi [_.curry](https://lodash.com/docs#curry)din biblioteca lodash, returnează un înveliș care permite ca o funcție să fie apelată atât în mod normal, cât și parțial:
46
46
47
47
```js run
48
48
functionsum(a, b) {
49
49
return a + b;
50
50
}
51
51
52
-
let curriedSum =_.curry(sum); //using _.curry from lodash library
52
+
let curriedSum =_.curry(sum); //folosind _.curry din biblioteca lodash
53
53
54
-
alert( curriedSum(1, 2) ); // 3, still callable normally
55
-
alert( curriedSum(1)(2) ); // 3, called partially
54
+
alert( curriedSum(1, 2) ); // 3, încă apelabilă în mod normal
55
+
alert( curriedSum(1)(2) ); // 3, apelată parțial
56
56
```
57
57
58
-
## Currying? What for?
58
+
## Currying? Pentru ce?
59
59
60
-
To understand the benefits we need a worthy real-life example.
60
+
Pentru a înțelege beneficiile, avem nevoie de un exemplu demn din viața reală.
61
61
62
-
For instance, we have the logging function `log(date, importance, message)`that formats and outputs the information. In real projects such functions have many useful features like sending logs over the network, here we'll just use`alert`:
62
+
De exemplu, avem funcția de logare `log(date, importance, message)`care formatează și produce informații. În proiectele reale astfel de funcții au multe caracteristici utile cum ar fi trimiterea de loguri prin rețea, aici vom folosi doar`alert`:
Now we can easily make a convenience function for current logs:
88
+
Acum putem realiza cu ușurință o funcție de conveniență pentru logurile curente:
89
89
90
90
```js
91
-
// logNow will be the partial of log with fixed first argument
91
+
// logNow va fi logul parțial cu primul argument fix
92
92
let logNow =log(newDate());
93
93
94
-
//use it
95
-
logNow("INFO", "message"); // [HH:mm] INFO message
94
+
//folosiți-l
95
+
logNow("INFO", "mesaj"); // [HH:mm] INFO mesaj
96
96
```
97
97
98
-
Now`logNow`is`log`with fixed first argument, in other words "partially applied function" or "partial" for short.
98
+
Acum`logNow`este`log`cu primul argument fix, cu alte cuvinte "funcție parțial aplicată" sau "parțială" pe scurt.
99
99
100
-
We can go further and make a convenience function for current debug logs:
100
+
Putem merge mai departe și să facem o funcție de conveniență pentru logurile curente de debug:
101
101
102
102
```js
103
103
let debugNow =logNow("DEBUG");
104
104
105
-
debugNow("message"); // [HH:mm] DEBUG message
105
+
debugNow("mesaj"); // [HH:mm] DEBUG mesaj
106
106
```
107
107
108
-
So:
109
-
1.We didn't lose anything after currying: `log`is still callable normally.
110
-
2.We can easily generate partial functions such as for today's logs.
108
+
Deci:
109
+
1.Nu am pierdut nimic după curry: `log`este încă apelabil în mod normal.
110
+
2.Putem genera cu ușurință funcții parțiale, cum ar fi pentru logurile de astăzi.
111
111
112
-
## Advanced curry implementation
112
+
## Implementarea curry avansată
113
113
114
-
In case you'd like to get in to the details, here's the "advanced" curry implementation for multi-argument functions that we could use above.
114
+
În cazul în care doriți să intrați în detalii, iată implementarea curry "avansată" pentru funcții cu argumente multiple pe care am putea-o folosi mai sus.
115
115
116
-
It's pretty short:
116
+
Este destul de scurtă:
117
117
118
118
```js
119
119
functioncurry(func) {
@@ -131,7 +131,7 @@ function curry(func) {
131
131
}
132
132
```
133
133
134
-
Usage examples:
134
+
Exemple de utilizare:
135
135
136
136
```js
137
137
functionsum(a, b, c) {
@@ -140,17 +140,17 @@ function sum(a, b, c) {
140
140
141
141
let curriedSum =curry(sum);
142
142
143
-
alert( curriedSum(1, 2, 3) ); // 6, still callable normally
144
-
alert( curriedSum(1)(2,3) ); // 6, currying of 1st arg
145
-
alert( curriedSum(1)(2)(3) ); // 6, full currying
143
+
alert( curriedSum(1, 2, 3) ); // 6, încă apelabil în mod normal
144
+
alert( curriedSum(1)(2,3) ); // 6, curry de la primul argument
145
+
alert( curriedSum(1)(2)(3) ); // 6, currying complet
146
146
```
147
147
148
-
The new `curry`may look complicated, but it's actually easy to understand.
148
+
Noul `curry`poate părea complicat, dar este de fapt ușor de înțeles.
149
149
150
-
The result of `curry(func)`call is the wrapper `curried`that looks like this:
150
+
Rezultatul apelului `curry(func)`este învelișul `curried`care arată astfel:
151
151
152
152
```js
153
-
// func is the function to transform
153
+
// func este funcția de transformat
154
154
functioncurried(...args) {
155
155
if (args.length>=func.length) { // (1)
156
156
returnfunc.apply(this, args);
@@ -162,27 +162,27 @@ function curried(...args) {
162
162
};
163
163
```
164
164
165
-
When we run it, there are two `if` execution branches:
165
+
Când îl rulăm, există două ramuri de execuție `if`:
166
166
167
-
1.If passed `args`count is the same or more than the original function has in its definition (`func.length`) , then just pass the call to it using `func.apply`.
168
-
2.Otherwise, get a partial: we don't call `func`just yet. Instead, another wrapper is returned, that will re-apply `curried`providing previous arguments together with the new ones.
167
+
1.Dacă numărul de `args`transmis este același sau mai mare decât numărul de funcții originale din definiția sa (`func.length`) , atunci doar transmite apelul la aceasta folosind `func.apply`.
168
+
2.În caz contrar, obține o parțială: nu apelăm `func`deocamdată. În schimb, este returnat un alt înveliș, care va aplica din nou `curried`furnizând argumentele anterioare împreună cu cele noi.
169
169
170
-
Then, if we call it, again, we'll get either a new partial (if not enough arguments) or, finally, the result.
170
+
Apoi, dacă îl apelăm, din nou, vom obține fie un nou parțial (dacă nu sunt suficiente argumente), fie, în final, rezultatul.
171
171
172
-
```smart header="Fixed-length functions only"
173
-
The currying requires the function to have a fixed number of arguments.
172
+
```smart header="Numai funcții cu lungime fixă"
173
+
Currying necesită ca funcția să aibă un număr fix de argumente.
174
174
175
-
A function that uses rest parameters, such as `f(...args)`, can't be curried this way.
175
+
O funcție care utilizează parametri rest, cum ar fi `f(...args)`, nu poate fi curryată în acest mod.
176
176
```
177
177
178
-
```smart header="A little more than currying"
179
-
By definition, currying should convert `sum(a, b, c)` into `sum(a)(b)(c)`.
178
+
```smart header="Un pic mai mult decât currying"
179
+
Prin definiție, currying ar trebui să convertească `sum(a, b, c)` în `sum(a)(b)(c)`.
180
180
181
-
But most implementations of currying in JavaScript are advanced, as described: they also keep the function callable in the multi-argument variant.
181
+
Dar majoritatea implementărilor de currying în JavaScript sunt avansate, așa cum este descris: ele de asemenea păstrează funcția apelabilă și în varianta cu mai multe argumente.
182
182
```
183
183
184
184
## Summary
185
185
186
-
*Currying*is a transform that makes`f(a,b,c)`callable as`f(a)(b)(c)`. JavaScript implementations usually both keep the function callable normally and return the partial if the arguments count is not enough.
186
+
*Currying*este o transformare care face`f(a,b,c)`apelabilă ca`f(a)(b)(c)`. De obicei, implementările JavaScript păstrează funcția apelabilă în mod normal și în același timp returnează funcția parțială dacă numărul de argumente nu este suficient.
187
187
188
-
Currying allows us to easily get partials. As we've seen in the logging example, after currying the three argument universal function`log(date, importance, message)`gives us partials when called with one argument (like `log(date)`) or two arguments (like`log(date, importance)`).
188
+
Currying ne permite să obținem cu ușurință parțiale. După cum am văzut în exemplul de logare, după currying, funcția universală cu trei argumente`log(date, importance, message)`ne oferă parțiale când este apelată cu un singur argument (cum ar fi `log(date)`) sau cu două argumente (cum ar fi`log(date, importance)`).
0 commit comments