Funktsionaalne programmeerimine JavaScript 2. osa - Kombinaatorid
Pawel Ged
Vue.js Arendaja
See on teine osa meie artiklite sarjast, mis on pühendatud funktsionaalse programmeerimise võimsusele JavaScript-s. Vaadake seda artiklit, et laiendada oma teadmisi kombinaatorite kohta.
Sissejuhatus kombinaatoritesse
Kombinaatorid on kõrgema taseme funktsioonid, mis võimaldavad kombineerida funktsioone, muutujaid või teisi kombinaatoreid. Tavaliselt ei sisalda need oma muutujate või äriloogika deklaratsioone. Nad on ainsad, mis loputavad kontrolli funktsiooniprogrammis.
Käesolevas artiklis püüan käsitleda neist mõningaid:
Tap
Currying
Toru/koosseis
Kahvel
Vaheldumine
Järjestus
Tap
Kombinaator on väga kasulik funktsioonide puhul, mis ei tagasta midagi. See võtab funktsiooni, kuhu parameeter läheb, ja seejärel tagastatakse see.
const [items, setItems] = useState(() => [])
axios
.get('http://localhost')
.then({ data } => {
setItems(data)
console.log(data)
onLoadData(data)
}).then(....) // tagastab undefined - andmed lubaduses on muudetud.
Deklaratiivne näide
const [items, setItems] = useState(() => [])
axios
.get('http://localhost')
.then(({ data }) => data)
.then(tap(setItems)) // (data) => { setItems(data); return data }
.then(tap(console.log)) // üks then = üks funktsioon = üks vastutus
.then(tap(onLoadData))
.then(....) // ikkagi juurdepääs algsetele andmetele
// lihtne säilitada avatud/suletud põhimõtet
Currying
See jagab funktsiooni argumendid ja võimaldab neid järjestikku välja kutsuda.
const sum = (a, b, c) => a + b + c
const currySum = curry(sum)
/*
võimalikud kutsed
currySum(a)(b)(c),
currySum(a)(b,c),
currySum(a,b)(c),
currySum(a,b,c)
*/
currySum(1) // (b, c) => 1 + a + b või (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) // tagastab 5
const multiplyByFive = multiplyBy(5)
multiplyByFive(10) // tagastab 50
Toru/koosseis
Kompositsiooni abil on võimalik andmeid ühest funktsioonist teise edastada. Oluline on, et funktsioonid võtaksid sama arvu argumente. Pipe ja compose erinevus seisneb selles, et esimene täidab funktsiooni esimesest kuni viimaseni ja compose kutsub neid lõpust alates.