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
+11-11Lines changed: 11 additions & 11 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -5,13 +5,13 @@ libs:
5
5
6
6
# Currying
7
7
8
-
Il [currying](https://en.wikipedia.org/wiki/Currying) è una tecnica avanzata che si applica durante lo sviluppo di funzioni. Non viene utilizzata solamente in JavaScript, ma anche in altri linguaggi di programmazione.
8
+
Il [currying](https://en.wikipedia.org/wiki/Currying) è una tecnica avanzata che si applica alle funzioni. Non viene utilizzata solamente in JavaScript, ma anche in altri linguaggi di programmazione.
9
9
10
-
Il currying è una trasformazione delle funzioni, in cui si traduce una funzione invocabile come `f(a, b, c)` in una invocabile come `f(a)(b)(c)`.
10
+
Il currying è una trasformazione che traduce una funzione invocabile come `f(a, b, c)` in una invocabile come `f(a)(b)(c)`.
11
11
12
12
Il currying non invoca la funzione. Si occupa solamente della sua trasformazione.
13
13
14
-
Come prima cosa vediamo un esempio, in modo da capire di cosa stiamo parlando, e le sue applicazioni nella pratica.
14
+
Come prima cosa vediamo un esempio, in modo da capire di cosa stiamo parlando, e le applicazioni nella pratica.
15
15
16
16
Creeremo una funzione di supporto `curry(f)` che esegue il currying per una funzione a due argomenti `f`. In altre parole, `curry(f)`, trasformerà `f(a, b)` in una funzione invocabile come `f(a)(b)`:
Per poterne comprendere i benefici abbiamo bisogno di un esempio di applicazione reale.
61
61
62
-
Ad esempio, abbiamo una funzione di logging `log(date, importance, message)` che formatta e ritorna le informazioni. In un progetto reale una funzione del genere ha diverse funzionalità utili, come l'invio di log in rete, qui useremo semplicemente un `alert`:
62
+
Ad esempio, abbiamo una funzione di logging `log(date, importance, message)` che formatta e ritorna le informazioni. In un progetto reale, una funzione del genere ha diverse funzionalità utili, come l'invio di log in rete, qui useremo semplicemente un `alert`:
Ora possiamo creare una funzione utile per i logs attuali:
88
+
Ora possiamo creare una funzione utile per registrare i logs:
89
89
90
90
```js
91
91
// logNow sarà la versione parziale di log con il primo argomento fisso
@@ -97,7 +97,7 @@ logNow("INFO", "message"); // [HH:mm] INFO message
97
97
98
98
Ora `logNow` equivale a `log` con il primo argomento fissato, in altre parole, una "funzione applicata parzialmente" o "parziale" (più breve).
99
99
100
-
Possiamo anche andare oltre, e creare una funzione utile per i logs di debug attuali:
100
+
Possiamo anche andare oltre, e creare una funzione utile per registrare i logs di debug:
101
101
102
102
```js
103
103
let debugNow =logNow("DEBUG");
@@ -111,7 +111,7 @@ Quindi:
111
111
112
112
## Implementazione avanzata del currying
113
113
114
-
Nel caso in cui vogliate entrare più nel dettaglio, di seguito vediamo un'implementazione "avanzata" del currying per funzioni con più argomenti che avremmo potuto usare sopra.
114
+
Nel caso in cui vogliate entrare più nel dettaglio, di seguito vediamo un'implementazione "avanzata" del currying per funzioni con più argomenti, che avremmo anche potuto usare sopra.
La funzione `curry` può sembrare complicata, ma in realtà è piuttosto semplice da capire.
149
149
150
-
Il risultato dell'invocazione `curry(func)` è il wrapper `curried` (che ha subito il processo di curryiong), ed appare in questo modo:
150
+
Il risultato dell'invocazione `curry(func)` è il wrapper `curried` (che ha subito il processo di currying), ed appare in questo modo:
151
151
152
152
```js
153
153
// func è la funzionie trasformata
@@ -165,9 +165,9 @@ function curried(...args) {
165
165
Quando la eseguiamo, ci sono due percorsi di esecuzione `if`:
166
166
167
167
1. Se il numero di `args` forniti è uguale o maggiore rispetto a quelli che la funzione originale ha nella sua definizione (`func.length`), allora gli giriamo semplicemente l'invocazione utilizzando `func.apply`.
168
-
2. Altrimenti, otterremo un parziale: non invochiamo ancora `func`. Invece, un altro wrapper viene ritornato, che riapplicherà il `curried`fornendo gli argomenti precedenti insieme a quelli nuovi.
168
+
2. Altrimenti, otterremo un parziale: non invochiamo ancora `func`. Invece, viene ritornato un altro wrapper, che riapplicherà il `curried`passando gli argomenti precedenti insieme a quelli nuovi.
169
169
170
-
Successivamente, se la invochiamo, di nuovo avremmo o una nuova funzione parziale (se non vengono forniti abbastanza argomenti) oppure otteremo il risultato.
170
+
Quindi, se la invochiamo, di nuovo, avremo o una nuova funzione parziale (se non vengono forniti abbastanza argomenti) oppure otterremo il risultato.
171
171
172
172
```smart header="Solo funzioni di lunghezza fissa"
173
173
Il currying richiede che la funzione abbia un numero fissato di argomenti.
@@ -183,6 +183,6 @@ Ma la maggiora parte delle implementazioni in JavaScript sono più avanzate di c
183
183
184
184
## Riepilogo
185
185
186
-
Il *currying* è una trasformazione che rende `f(a,b,c)` invocabile come `f(a)(b)(c)`. Le implementazioni in JavaScript, solitamente, mantengono entrambe le varianti, sia quella normale che quella parziale, se invoca con un numero di argomenti non sufficienti.
186
+
Il *currying* è una trasformazione che rende `f(a,b,c)` invocabile come `f(a)(b)(c)`. Le implementazioni in JavaScript, solitamente, mantengono entrambe le varianti, sia quella normale che quella parziale, se il numero di argomenti non è sufficiente.
187
187
188
188
Il currying permette di ottenere delle funzioni parziali molto semplicemente. Come abbiamo visto nell'esempio del logging, dopo il currying la funzione universale a tre argomenti `log(date, importance, message)` ci fornisce una funzione parziale quando invocata con un solo argomento (come `log(date)`) o due argomenti (come `log(date, importance)`).
0 commit comments