Funksjonell programmering i JavaScript Del 2 - Kombinatorer
Pawel Ged
Vue.js-utvikler
Dette er andre del av vår artikkelserie om kraften i funksjonell programmering i JavaScript. Sjekk denne artikkelen for å utvide kunnskapen din om kombinatorer.
Introduksjon til kombinatorer
Kombinatorer er funksjoner på høyere nivå som lar deg kombinere funksjoner, variabler eller andre kombinatorer. Vanligvis inneholder de ikke deklarasjoner av egne variabler eller forretningslogikk. De er de eneste som kan spyle kontrollen i et funksjonsprogram.
I denne artikkelen vil jeg forsøke å ta for meg noen av dem:
Trykk på
Currying
Pipe/Compose
Gaffel
Alternasjon
Sekvens
Trykk på
En kombinator er veldig nyttig for funksjoner som ikke returnerer noe. Den tar funksjonen som parameteren går til, og deretter returneres den.
const [items, setItems] = useState(() => [])
axios
.get('http://localhost')
.then({ data } => {
setItems(data)
console.log(data)
onLoadData(data)
}).then(...) // returnerer udefinert - dataene i løftet har blitt endret
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 funksjon = et ansvar
.then(tap(onLoadData))
.then(...) // fortsatt tilgang til opprinnelige data
// enkelt å opprettholde åpne/lukke-prinsippet
Currying
Den deler opp argumentene til en funksjon og gjør det mulig å kalle dem sekvensielt.
const sum = (a, b, c) => a + b + c
const currySum = curry(sum)
/*
mulige anrop
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
Gjennom komposisjon er det mulig å sende data fra en funksjon til en annen. Det er viktig at funksjonene tar samme antall argumenter. Forskjellen mellom pipe og compose er at den første utfører funksjonen fra først til sist, mens compose kaller dem fra slutten.
const length = (matrise) => matrise.lengde
const sum = (matrise) => matrise.reduce((a, b) => a + b, 0)
const divide = (a, b) => a / b
const arithmeticAverage = fork(divide, sum, lengde)
arithmeticAverage([5, 3, 2, 8, 4, 2]) // returnerer 4
Alternasjon
Denne kombinatoren tar to funksjoner og returnerer resultatet av den første hvis det er sant. I motsatt fall returnerer den resultatet av den andre funksjonen.