Funkční programování v JavaScript, část 2 - Kombinátory
Pawel Ged
Vue.js Vývojář
Toto je druhý díl naší série článků věnovaných síle funkcionálního programování v JavaScript. Podívejte se na tento článek a rozšiřte si své znalosti o kombinátorech.
Úvod do kombinátorů
Kombinátory jsou funkce vyšší úrovně, které umožňují kombinovat funkce, proměnné nebo jiné kombinátory. Obvykle neobsahují deklarace vlastních proměnných nebo obchodní logiky. Jsou jediné, které slouží ke spláchnutí řízení v programu funkcí.
V tomto článku se pokusím popsat několik z nich:
Klepněte na
Currying
Pipe/Compose
Vidlice
Střídání
Sekvence
Klepněte na
Kombinátor je velmi užitečný pro funkce, které nic nevracejí. Přebírá funkci, do které jde parametr, a pak ji vrací.
const [items, setItems] = useState(() => [])
axios
.get('http://localhost')
.then({ data } => {
setItems(data)
console.log(data)
onLoadData(data)
}).then(...) // vrací nedefinováno - data v příslibu byla změněna
Deklarativní příklad
const [items, setItems] = useState(() => [])
axios
.get('http://localhost')
.then(({ data }) => data)
.then(tap(setItems)) // (data) => { setItems(data); return data }
.then(tap(console.log)) // jeden then = jedna funkce = jedna odpovědnost
.then(tap(onLoadData))
.then(...) // stále přístup k původním datům
// snadné zachování principu open/close
Currying
Rozděluje argumenty funkce a umožňuje jejich postupné volání.
const sum = (a, b, c) => a + b + c
const currySum = curry(sum)
/*
možná volání
currySum(a)(b)(c),
currySum(a)(b,c),
currySum(a,b)(c),
currySum(a,b,c)
*/
currySum(1) // (b, c) => 1 + a + b nebo (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) // vrací 5
const multiplyByFive = multiplyBy(5)
multiplyByFive(10) // vrací 50
Pipe/Compose
Prostřednictvím kompozice je možné předávat data z jedné funkce do druhé. Je důležité, aby funkce přijímaly stejný počet argumentů. Rozdíl mezi funkcemi pipe a compose spočívá v tom, že první z nich vykonává funkce od prvního do posledního, zatímco compose je volá od konce.