Funkcionālā programmēšana JavaScript 2. daļa - Kombinatori
Pawel Ged
Vue.js izstrādātājs
Šī ir otrā daļa no mūsu rakstu sērijas, kas veltīta funkcionālās programmēšanas spējai JavaScript. Pārbaudiet šo rakstu, lai paplašinātu savas zināšanas par kombinatoriem.
Ievads kombinatoros
Kombinatori ir augstākā līmeņa funkcija, kas ļauj apvienot funkcijas, mainīgos vai citus kombinatorus. Parasti tie nesatur savu mainīgo vai biznesa loģikas deklarācijas. Tie ir vienīgie, kas ļauj izpludināt kontroli funkciju programmā.
Šajā rakstā centīšos aplūkot dažus no tiem:
Pieskarieties
Currying
Pipe/Compose
Dakša
Alternācija
Sekvence
Pieskarieties
Kombinators ir ļoti noderīgs funkcijām, kas neko neatgriež. Tas pieņem funkciju, kurai tiek nosūtīts parametrs, un pēc tam tas tiek atgriezts.
const [items, setItems] = useState(() => [])
axios
.get('http://localhost')
.then({ dati } => {
setItems(data)
console.log(data)
onLoadData(data)
}).then(...) // atgriež nenoteikts - solījumā ietvertie dati ir mainīti.
Deklaratīvs piemērs
const [items, setItems] = useState(() => [])
axios
.get('http://localhost')
.then(({ data }) => data)
.then(tap(setItems)) // (data) => { setItems(data); return data }
.then(tap(console.log)) // viens then = viena funkcija = viena atbildība
.then(tap(onLoadData))
.then(...) // joprojām piekļuve sākotnējiem datiem
// viegli saglabāt atvēršanas/aizvēršanas principu
Currying
Tas sadala funkcijas argumentus un ļauj tos izsaukt secīgi.
const sum = (a, b, c) => a + b + c
const currySum = curry(sum)
/*
iespējamie izsaukumi
currySum(a)(b)(c),
currySum(a)(b,c),
currySum(a,b)(c),
currySum(a,b,c)
*/
currySum(1) // (b, c) => 1 + a + b vai (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) // atgriež 5
const multiplyByFive = multiplyBy(5)
multiplyByFive(10) // atgriež 50
Pipe/Compose
Izmantojot kompozīciju, ir iespējams nodot datus no vienas funkcijas citai. Svarīgi, lai funkcijām būtu vienāds argumentu skaits. Atšķirība starp pipe un compose ir tāda, ka pirmā funkcija izpilda funkciju no pirmās līdz pēdējai, bet compose izsauc tās no beigām.