«Несмотря на то, что функции не могут изменять состояние, это хорошо, потому что это помогает нам рассуждать о наших программах, с этим есть одна проблема. Если функция не может ничего изменить в мире, как она должна сообщить нам, что она вычислила? Чтобы сообщить нам, что он вычислил, он должен изменить состояние устройства вывода (обычно состояние экрана), которое затем испускает фотоны, которые попадают в наш мозг и изменяют состояние нашего разума, чувак».
Миран Липовача

Вы когда-нибудь слышали, что в функциональном программировании все является функцией? А вы думали, что это невозможно, потому что у нас есть циклы, булевы значения и переменные. В этой статье я покажу, как создавать логические функции с помощью каррирования 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