«Несмотря на то, что функции не могут изменять состояние, это хорошо, потому что это помогает нам рассуждать о наших программах, с этим есть одна проблема. Если функция не может ничего изменить в мире, как она должна сообщить нам, что она вычислила? Чтобы сообщить нам, что он вычислил, он должен изменить состояние устройства вывода (обычно состояние экрана), которое затем испускает фотоны, которые попадают в наш мозг и изменяют состояние нашего разума, чувак».
― Миран Липовача
Вы когда-нибудь слышали, что в функциональном программировании все является функцией? А вы думали, что это невозможно, потому что у нас есть циклы, булевы значения и переменные. В этой статье я покажу, как создавать логические функции с помощью каррирования JavaScript. Давайте начнем делать функции одного параметра и применим на практике переноски.
Пример функции каррирования:
const add = x => y => x + y; const ExampleSum1 = add(10)(5); // 10+5 = 15
const fiveAdder = add(5); const ExampleSum2 = fiveAdder(10); // 10+5 = 15
В ПОРЯДКЕ. Теперь, когда мы знаем, как простая функция добавления работает с каррированием, нам нужно начать работать с булевой логикой, такой как НЕ, И, ИЛИ, EQ, XOR, также мы должны написать некоторые атомарные функции.
Функция, которая всегда возвращает первый аргумент:
const first = (a) => (b) => a; var firstArgument = first(5)(10); console.log(firstArgument); //5
Функция, которая всегда возвращает второй аргумент:
const second = (a) => (b) => b; var secondArgument = second(5)(10); console.log(secondArgument);// 10
Теперь мы можем определить наши функции TRUE и FALSE:
const T = first; const F = second; //for console logging T.inspect = () => "true"; F.inspect = () => "false";
Пока все хорошо, у нас есть функции TF, и мы можем вам сделать логические функции более высокого порядка:
✔️НЕ работает
const not = f => f(F)(T);
✔️И функция
const and = f => a => f(a)(f); console.log(and(T)(T)); // true console.log(and(T)(F)); // false console.log(and(F)(F)); // false console.log(and(F)(T)); // false
✔️Функция ИЛИ
const or = f => a => f(f)(a); console.log(or(T)(T)); // true console.log(or(T)(F)); // true console.log(or(F)(F)); // false console.log(or(F)(T)); // true
✔️Функция эквалайзера
const eq = f => a => f(a)(not(a)); console.log(eq(T)(T)); // true console.log(eq(T)(F)); // false console.log(eq(F)(F)); // true console.log(eq(F)(T)); // false
✔️Функция XOR
const xor = f => a => f(not(a))(a); console.log(xor(T)(T)); // false console.log(xor(T)(F)); // true console.log(xor(F)(F)); // false console.log(xor(F)(T)); // true
Поздравляем, вы добились успеха🎉 🎉 🎉 💯 Вот как работает каррирование в функциональном программировании. Вы можете получить код ниже.
Весь код
const first = (a) => (b) => a; const second = (a) => (b) => b; const T = first; const F = second; //for console logging T.inspect = () => "true"; F.inspect = () => "false"; const not = f => f(F)(T); const and = f => a => f(a)(f); const or = f => a => f(f)(a); const eq = f => a => f(a)(not(a)); const xor = f => a => f(not(a))(a); var firstArgument = first(5)(10); console.log(firstArgument); var secondArgument = second(5)(10); console.log(secondArgument); var secondArgument = second(5)(10); console.log(secondArgument); console.log(and(T)(T)); // true console.log(and(T)(F)); // false console.log(and(F)(F)); // false console.log(and(F)(T)); // false console.log(or(T)(T)); // true console.log(or(T)(F)); // true console.log(or(F)(F)); // false console.log(or(F)(T)); // true console.log(eq(T)(T)); // true console.log(eq(T)(F)); // false console.log(eq(F)(F)); // true console.log(eq(F)(T)); // false console.log(xor(T)(T)); // false console.log(xor(T)(F)); // true console.log(xor(F)(F)); // false console.log(xor(F)(T)); // true