Polski frontend

Piotr Kowalski — JavaScript, Front-end oraz Node.js

Funkcja do kompozycji — compose

Kilka dni temu opublikowałem projekt na GitHubie, którego główną ideą jest komponowanie funkcji. Źródła projektu składają się z jednej funkcji, która należy do zbioru funkcji typu Higher-order Function.

module.exports = function compose(...fnList) { const iterator = fnList[Symbol.iterator](); let result = null; function handle(...args) { const fn = iterator.next().value; if (typeof fn === 'undefined') return result; if (typeof fn !== 'function') throw new TypeError(); result = fn(...args); return handle(result); } return handle(); };

Listing 1. Cały kod paczki @piecioshka/compose.

Użycie takiej funkcji sprowadza się do uruchomienia:

const init = () => 2; const plusOne = (v) => v + 1; const multiplyBy10 = (v) => v * 10; const what = compose( init, plusOne, multiplyBy10 ); console.log(what); // 30

Listing 2. “Składanie” funkcji w jedną.

f(init, plusOne, multiplyBy10)(x) = multiplyBy10(plusOne(init(x)));

Listing 3. Matematyczny zapis składania funkcji.

Compose vs Pipe

Istnieje umowna zasada, odnośnie kolejność “składanych” funkcji. Biblioteka, którą napisałem, powinna nazywać się pipe, bo uruchamia funkcje w kolejności ich definicji.

Podobnie jak ma to miejsce w terminalu:

ll | wc -l na początku zostanie uruchomione polecenie ll, a następnie wc -l.

Dziękuję @miloszp za podpowiedź w temacie compose vs pipe.

Bibliografia o Higher-order Function autorstwa Piotra Nalepy o Curryingu autorstwa Daniela Idaszaka Więcej na temat programowania funkcyjnego znajdziesz na blogu — codewithstyle.info Jeśli jesteście ciekawi jak wygląda temat HOF w książce “Eloquent JavaScript” to zapraszam: https://eloquentjavascript.net/05_higher_order.html Mój dobry kolega Kyle Simson w swojej książce YDKJS także opisał tematykę domknięć