Funktionel programmering i JavaScript Del 2 - Kombinatorer
Pawel Ged
Vue.js-udvikler
Dette er anden del af vores artikelserie om kraften i funktionel programmering i JavaScript. Tjek denne artikel for at udvide din viden om kombinatorer.
Introduktion til kombinatorer
Kombinatorer er funktioner på et højere niveau, som gør det muligt at kombinere funktioner, variabler eller andre kombinatorer. Normalt indeholder de ikke erklæringer af deres egne variabler eller forretningslogik. De er de eneste, der kan skylle kontrollen i et funktionsprogram.
I denne artikel vil jeg forsøge at dække et par af dem:
Tap
Karry
Pipe/Compose
Gaffel
Vekselvirkning
Sekvens
Tap
En kombinator er meget nyttig til funktioner, der ikke returnerer noget. Den tager den funktion, som parameteren går til, og så returneres den.
const [items, setItems] = useState(() => [])
axios
.get('http://localhost')
.then({ data } => {
setItems(data)
console.log(data)
onLoadData(data)
}).then(...) // returnerer udefineret - dataene i løftet er blevet ændret
Deklarativt eksempel
const [items, setItems] = useState(() => [])
axios
.get('http://localhost')
.then(({ data }) => data)
.then(tap(setItems)) // (data) => { setItems(data); return data }
.then(tap(console.log)) // en then = en funktion = et ansvar
.then(tap(onLoadData))
.then(...) // stadig adgang til oprindelige data
// nemt at opretholde åbne/lukke-princippet
Karry
Den opdeler argumenterne i en funktion og gør det muligt at kalde dem sekventielt.
const sum = (a, b, c) => a + b + c
const currySum = curry(sum)
/*
mulige kald
currySum(a)(b)(c),
currySum(a)(b,c),
currySum(a,b)(c),
currySum(a,b,c)
*/
currySum(1) // (b, c) => 1 + a + b eller (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) // returnerer 5
const multiplyByFive = multiplyBy(5)
multiplyByFive(10) // returnerer 50
Pipe/Compose
Gennem komposition er det muligt at sende data fra en funktion til en anden. Det er vigtigt, at funktionerne tager det samme antal argumenter. Forskellen mellem pipe og compose er, at den første udfører funktionen fra først til sidst, og compose kalder dem fra slutningen.