Автор оригинала: FreeCodeCamp Community Member.
Матеус Сокола
За последние два года сообщество JavaScript говорило о функциональном программировании. Функциональное программирование позволяет нам построить лучшее программное обеспечение без проектирования комплексных классов деревьев. Сегодня я объясню, как использовать функциональную композицию в Tymdercript и Лоташ Отказ
Код может быть Найдено на Github Отказ
Что такое функциональная композиция?
Функциональная композиция включает в себя объединение двух или более функций для создания более сложной. Сбит с толку? Никаких забот, в следующем примере это даст это понятно:
const f = function (a) { return a + 1 };const g = function (b) { return b * b };const x = 2;const result = f(g(x)); // => 5
Я объединил две функции здесь – функция F и функция грамм. Функция f добавляет 1 к А Параметр и функция G умножает . B Параметр по B Отказ Результат 5.
Давайте реверс-инженер это:
- Постоянный х равно 2
- Постоянный х становится аргументом функции g
- Функция G Возвращает 4
- Функция G Выход (4) становится аргументом функции f
- Функция F Возвращает 5.
Это не ракетная наука, но это не выглядит особенно полезной. На самом деле, это выглядит еще более сложно, чем держать его в одной функции. Это может быть правдой, но давайте рассмотрим некоторые реалистичные случаи использования.
Реальный пример: форматирование денег
Я строил простую публикацию работы для разработчиков. Одним из требований было отображение вариантов зарплаты рядом с каждым предложением. Все зарплаты хранились в виде центов и должны быть похоже на это:
from: 6000000 to: 60,000.00 USD
Это выглядит легко, но работает с текстом трудно. Почти каждый разработчик ненавидит это.
Мы все проводим часы, написав регулярные выражения и имеющие дело с Unicode. Когда мне нужно отформатировать текст, я всегда пытаюсь погладить решение. После отсечения всех библиотек (слишком много для моих нужд) и все фрагменты кода, которые сосут, что осталось не так сильно.
Я решил, что мне нужно было построить его на своем собственном формате.
Как мы его построим?
Прежде чем мы начнем писать код, давайте копаемся в идею, которую я нашел:
- Сплит доллары и центы.
- Формат долларов – добавление тысяч сепараторов не так просто.
- Формат центов – дело с центами легко, почти не в коробке.
- Соедините вместе доллары и центы с сепаратором.
Теперь это выглядит ясно. Последнее, что нам нужно рассмотреть, это то, как добавить тысячи сепараторов в доллары. Давайте рассмотрим следующий алгоритм:
- Обратная строка.
- Разделить строку каждые 3 символа для массива.
- Присоединяйтесь к всем элементам массива вместе, добавив тысячу разделителя между ними.
- Обратная строка.
Все эти шаги могут быть переведены в следующий псевдо-код:
1. "60000" => "00006"2. "00006" => ["000", "06"]3. ["000", "06"] => "000.06"4. "000.06" => "60.000"
И именно этот алгоритм переводится в составленные функции:
В первой строке вы заметите, что я использовал Лоташ библиотека. Лодаш содержит много утилит, которые облегчают функциональное программирование. Давайте проанализируем код из строки 22:
return flow([ reverse, splitCurry(match), joinCurry(separator), reverse]);
поток Функция – это функциональный композитор. Это трубопроводы результат Обратный Функция на вход Сплитcurry , и так далее. Это создает совершенно новую функцию. Помните тысячу алгоритма разделения сверху? Вот и все!
Вы можете увидеть, что я пособил разделить и присоединиться к функциям с «карри» и вызванным их. Эта техника называется carrying.
Что такое карри?
Carrying Это процесс перевода функции много аргументов в функцию единого аргумента. Функция единого аргумента возвращает другую функцию, если какие-либо аргументы все еще нужны.
Звучит жестко? Рассмотрим следующий пример:
Сплит Функция нуждается в двух аргументах – строку и шаблон разделения. Функция должна знать, как разделить текст. В этом случае мы не можем сочинять эту функцию, поскольку она нуждается в разных аргументах, чем другие. Вот где приходит карри.
import { curry } from "lodash";import split from "./split";const splitCurry = curry(split);
splitCurry("000001")(/[0-9]{1,3}/g); // => ["000", "001"]Теперь Сплитcurry Функция соответствует Обратный функция. Оба им нужны один аргумент. К сожалению, мы не призывали Сплитcurry Функция с шаблоном разделения еще. Это не будет работать таким образом.
Что делать, если мы поменяем заказ на аргумент в нашем карри?
import { curryRight } from "lodash";import split from "./split";const splitCurry = curryRight(split);
splitCurry(/[0-9]{1,3}/g)("000001"); // => ["000", "001"]Теперь наш код может работать так, как мы можем использовать каррики как заводские функции. Давайте посмотрим код еще раз:
return flow([ reverse, splitCurry(match), joinCurry(separator), reverse]);
Все эти функции принимают один аргумент (строка), поэтому мы можем составить их вместе. А затем используйте их в качестве автономной функции. Подождите минуту…
Что такое фабричные функции?
Заводские функции – это функции, которые создают новый объект. В нашем случае функция. Давайте рассмотрим наш тысяч разделитель снова. Теоретически, мы можем использовать ту же функцию все время. К сожалению, некоторые страны отделяют тысячи запятых, другие с точками. Конечно, я мог бы параметризировать сепаратор, но я решил использовать заводскую функцию.
const formatUS = thousandSeparator(',');const formatEU = thousandSeparator('.');formatUS(10000); // 10,000formatEU(10000); // 10.000
Резюме
В прошлом году я провел время освежаю свои знания из предыдущих исследований, чтобы я мог бы применить его в моем ежедневном бизнесе. В этой статье я не копался в монадском праве или моноидах – я не хотел, чтобы он запутал. Субъект широкий и глубоко укоренен в информатике. Я хотел дать вам представление о том, как приблизиться к функциональному мышлению, описывая все термины как можно кратко.
Я решил сохранить весь код на моем github Таким образом, статья легче читать.
Если у вас есть какие-либо проблемы или предложения, пожалуйста, напишите комментарий.
—
PS. Я начал Канал YouTube на программировании Отказ Пожалуйста, проверьте это и подпишитесь:)
Оригинал: “https://www.freecodecamp.org/news/how-to-make-your-life-easier-using-functional-programming-in-typescript-a2def76c468b/”