Nell'ultimo mese ho afferrato e dimenticato i punti più fini delle funzioni di curry alcune volte, quindi ecco un breve articolo che tratterà il concetto in generale.
Prima di entrare nel merito, sappi che il curry è molto utilizzato nella programmazione funzionale e si basa sul concetto di funzioni di ordine superiore , ovvero passare una funzione all'altra. Se sembra confuso, dai un'occhiata alla lettura rapida di quel concetto che ho scritto qui . Si tratta di una lettura di 3 minuti per aggiornarti.
Mentre l'atto delle funzioni di curry prende il nome da Haskell Curry, mi ha aiutato a pensarlo come fare un curry. Tradizionalmente, quando chiami una funzione, passi tutti i suoi argomenti in una volta e ciò che la funzione restituisce il tuo risultato. Quando si esegue il curry una funzione, la funzione viene suddivisa in funzioni parziali e prende i suoi argomenti uno alla volta , passando il primo argomento alla prima funzione parziale. Quando il primo parziale ritorna, la funzione curried prenderà l'argomento successivo, e così via, fino a quando non ci sono più argomenti da elaborare. Aggiungi un argomento e lascia sobbollire. Quando è pronto, aggiungi l'argomento successivo. È un po' come cucinare un curry.
Ok, c'è molto da disfare lì. Non farti prendere dal panico . È un concetto semplice e in pochi minuti ci sarai anche tu. Dai un'occhiata agli esempi di codifica di seguito.
Quindi diamo un'occhiata a questa funzione madlibs, scritta tradizionalmente, di seguito.
let madlibs = (name, food, number) =>
'My name is ' + name +
' and I love ' + food +
', I could eat ' + number +' plates of it!'
console.log (madlibs("Jerry","Spaghetti","10"))
My name is Jerry and I love Spaghetti, I could eat 10 plates of it!
let madlibs =
name =>
food =>
number =>
'My name is ' + name +
' and I love ' + food +
', I could eat ' + number +' plates of it!'
console.log (madlibs("Jerry")("Spaghetti")("10"))
My name is Jerry and I love Spaghetti, I could eat 10 plates of it!
console.log (madlibs("Jerry")("Spaghetti"))
(number) => 'My name is ' + name + ' and I love ' + food + ', I could eat ' + number + ' plates of it!'
La cosa importante da notare qui è come il currying ci dia la possibilità di aggiungere lentamente i nostri argomenti alla nostra funzione. Anche se potrebbe non essere ancora chiaro il motivo , il fatto che possiamo passare argomenti gradualmente e tornare alla nostra funzione in un secondo momento con più argomenti è utile, torneremo presto su questo concetto.
Ma prima di farlo, un'altra cosa che devi sapere è che possiamo utilizzare un certo numero di librerie di programmazione funzionale per avere JavaScript curry una funzione tradizionale per noi, ad esempio lodash:
import _ from 'lodash'
let madlibs = (name, food, number) =>
'My name is ' + name +
' and I love ' + food +
', I could eat ' + number +' plates of it!'
madlibs = _.curry(madlibs)
let jerry = madlibs("Jerry")
let jerrysFavoriteFood = jerry("Spaghetti")
console.log (jerrysFavoriteFood('10'))
let jerry = madlibs("Jerry")
My name is Jerry and I love Spaghetti, I could eat 10 plates of it!
let users = [
{id: 1, username: "cambot", favorite_color: "red"},
{id: 2, username: "gypsy", favorite_color: "purple"},
{id: 3, username: "tom", favorite_color: "red"},
{id: 4, username: "crow", favorite_color: "gold"},
{id: 5, username: "joel", favorite_color: "red"},
{id: 6, username: "mike", favorite_color: "blue"},
{id: 7, username: "jonah", favorite_color: "yellow"}
]
let faveColor = (favorite_color, obj) => obj.favorite_color === favorite_color
let usersThatLoveRed = users.filter(x => faveColor('red', x))
console.log(usersThatLoveRed)
[
{id:1,username:"cambot",favorite_color:"red"},{id:3,username:"tom",favorite_color:"red"},{id:5,username:"joel",favorite_color:"red"}
]
Funziona, ma guarda come chiamiamo faveColor. Gli passiamo 2 argomenti 'red’e x. Usando il currying, possiamo rendere il codice più leggibile. Nell'esempio seguente, otteniamo lo stesso risultato:
import _ from 'lodash'
let users = [
{id: 1, username: "cambot", favorite_color: "red"},
{id: 2, username: "gypsy", favorite_color: "purple"},
{id: 3, username: "tom", favorite_color: "red"},
{id: 4, username: "crow", favorite_color: "gold"},
{id: 5, username: "joel", favorite_color: "red"},
{id: 6, username: "mike", favorite_color: "blue"},
{id: 7, username: "jonah", favorite_color: "yellow"}
]
let faveColor = _.curry((favorite_color, obj) => obj.favorite_color === favorite_color)
let usersThatLoveRed = users.filter(faveColor('red'))
console.log(usersThatLoveRed)
E davvero, questo è ciò che riguarda le funzioni di curry
lodash, prendiamo una funzione che accetta più argomenti e la suddividiamo in funzioni parziali che accettano argomenti singoli
Questa settimana ho ricevuto un'e-mail da un membro della mailing list quotidiana. Volevano sapere: quali risorse visiti giornalmente, settimanalmente e mensilmente? Ottima domanda! Sono felice di provare a condividere alcune informazioni sul mio flusso di lavoro e sulle migliori risorse che utilizzo.
Lo scopo di questa serie di blog è approfondire la libreria Lit e acquisire una comprensione completa delle sue caratteristiche uniche e di come si distingue dalle altre librerie e framework sul mercato. La serie è divisa in tre parti, che coprono argomenti come 1.
(Attenzione: questa è satira, destinata ad essere allegramente sovversiva, sicuramente non per bambini) Hai visto tua madre e tuo padre nascondersi in cucina e fumare quelle sigarette puzzolenti. Ti dicono.
Di Alyson Lee, consulente per gli affari governativi Il processo di stanziamento annuale del governo federale è fondamentale per i nostri sforzi per finanziare la rimozione dell'anidride carbonica (CDR). Ogni anno, Carbon180 invia richieste a vari uffici congressuali per aiutare a guidare dove fluiranno i dollari del prossimo anno.
Ieri abbiamo chiuso le porte dell'Eurovision Song Contest di quest'anno con un gran finale scintillante e caotico in cui la cantante svedese Loreen ha portato a casa il trofeo, diventando la prima donna a vincere due volte e riportando la corona alla Svezia 50 anni dopo che gli ABBA hanno vinto la competizione con "Waterloo". Hanno continuato a diventare uno dei più grandi artisti nel canone della musica pop.
Recentemente sono stato su Linkedin, il social network professionale più grande del mondo, e ho trovato post di designer freelance che seguo che hanno attirato la mia attenzione. Tutti hanno postato foto dagli aeroplani, sulla spiaggia con i loro laptop, dalle piscine e dagli uffici con viste mozzafiato.