Funkcinis programavimas JavaScript 2 dalis - Kombinatoriai
Pawel Ged
Vue.js kūrėjas
Tai antroji straipsnių serijos, skirtos funkcinio programavimo galiai JavaScript, dalis. Peržiūrėkite šį straipsnį, kad praplėstumėte savo žinias apie kombinatorius.
Įvadas į kombinatorius
Kombinatoriai yra aukštesnio lygio funkcija, leidžianti sujungti funkcijas, kintamuosius ar kitus kombinatorius. Paprastai juose nėra savo kintamųjų ar verslo logikos deklaracijų. Jie yra vieninteliai, skirti funkcinės programos valdymui išplauti.
Šiame straipsnyje pabandysiu aptarti keletą iš jų:
Bakstelėkite
Currying
Vamzdis / Kompozicija
Šakutės
Pakaitinis
Sekvencija
Bakstelėkite
Kombinatorius labai naudingas funkcijoms, kurios nieko negrąžina. Jis paima funkciją, į kurią patenka parametras, ir tada jį grąžina.
const [items, setItems] = useState(() => [])
axios
.get('http://localhost')
.then({ duomenys } => {
setItems(duomenys)
console.log(data)
onLoadData(data)
}).then(...) // grąžinama neapibrėžta - pažadėjime esantys duomenys buvo pakeisti
Deklaratyvinis pavyzdys
const [items, setItems] = useState(() => [])
axios
.get('http://localhost')
.then(({ duomenys }) => duomenys)
.then(tap(setItems)) // (duomenys) => { setItems(duomenys); return data }
.then(tap(console.log)) // vienas then = viena funkcija = viena atsakomybė
.then(tap(onLoadData))
.then(...) // vis dar prieiga prie pradinių duomenų
// lengva išlaikyti atidarymo/uždarymo principą
Currying
Jis padalina funkcijos argumentus ir leidžia juos iškviesti iš eilės.
const sum = (a, b, c) => a + b + c
const currySum = curry(sum)
/*
galimi iškvietimai
currySum(a)(b)(c),
currySum(a)(b,c),
currySum(a,b)(c),
currySum(a,b,c)
*/
currySum(1) // (b, c) => 1 + a + b arba (b) => (c) => 1 + a + b
currySum(5)(10) // (c) => 5 + 10 + b
currySum(5, 10) // (c) => 5 + 10 + b
currySum(5)(10)(20) // 35
currySum(5, 10)(20) // 35
currySum(5)(10, 20) // 35
const divideBy = curry((a, b) => b / a)
const multiplyBy = curry((a, b) => a * b)
const divideByTwo = divideBy(2)
divideByTwo(10) // grąžina 5
const multiplyByFive = multiplyBy(5)
multiplyByFive(10) // grąžina 50
Vamzdis / Kompozicija
Naudojant kompoziciją galima perduoti duomenis iš vienos funkcijos į kitą. Svarbu, kad funkcijos priimtų tą patį argumentų skaičių. Skirtumas tarp pipe ir compose yra tas, kad pirmoji funkcija vykdo funkcijas nuo pirmos iki paskutinės, o compose jas iškviečia nuo galo.