Раджараодомв
Частью 1 Мы обсудили: функциональные основы программирования, карри, чистые функции, «Fantasy-Land» Specs, «Функторы», «Монады», «Может, монады» и «либо монады» через пару примеров.
В этой части мы будем охватывать: Applative, Curryn Function и «Применение валидации».
Пример 3- Назначение значений потенциально нулевым объектам
ФП-концепции используются: «Применитель»
Используйте корпус: Допустим, мы хотим дать скидку пользователю, если пользователь вошел в систему, и если мы запустим продвижение (то есть скидка).
Скажем, мы используем ApplyDiscount. метод ниже. Как вы можете себе представить, ApplyDiscount может бросать нулевые ошибки, если либо пользователь (левая сторона или скидка (правая сторона) – это ноль.
//Adds Скидка на объект пользователя, если и пользователь и скидка существуют. //бросает нулевые ошибки, если либо пользователь, либо скидка NullConst applydiscount = (пользователь, скидка) = > {Пусть (пользователь);//использую некоторые lib, чтобы сделать копию .код; Возврат пользовательскогоLONE; }
Давайте посмотрим, как мы можем решить это, используя «Применитель».
Применитель:
Любой класс, в котором есть метод «AP» и реализует заявитель SPEC, называется применением. Укладки могут использоваться в функциях, которые имеют дело с нулевыми значениями как на левой стороне (пользователю), так и в правой части (скидка) уравнения.
Оказывается, «возможно» монады (и каждый монад) также реализуют «AP» спецификации и, следовательно, также являются «примерами», а не только монады. Таким образом, мы можем использовать «может быть» монады, чтобы иметь дело с NULL на уровне функций.
Давайте посмотрим, как мы можем решить, сделайте работу ApplyDiscount, используя, возможно, используется как «применение».
Шаг 1: Оберните наши потенциальные нулевые значения в Монаде
const (пользователь); const (скидка);
Шаг 2: Перепишите функцию и карри ее, чтобы мы могли пройти один параметр за раз.
//переписать функцию и карри ее, чтобы мы могли //пропустите один параметр за раз var (функция (пользователь, скидка) { .Code; возвращаемый пользователь; });
Шаг 3: Давайте пройдем первый аргумент (удачно), чтобы подать заявку по «карте».
//Передайте первый аргумент на NatsoDiscount через «карту» const.map (applydiscount); //Примечание, поскольку applydiscount - это «карта», и «карта» будет пройти только 1 параметр, обратный результат ( maybeapplydiscountfunc ) будет, возможно, завернутая функция «instanceDiscount», которая теперь имеет возможности (1-й параметр) в этом закрытие. Другими словами, теперь у нас есть функция, завернутая в монаде!
Шаг 4: Сделка с MaybeapplyDiscountFunc
На этом этапе maybeapplydiscountfunc может быть: 1 Если пользователь на самом деле существует, то maybeapplydiscountfunc – это функция, завернутая внутри A, может быть,. 2. Если пользователь не существует, то maybeapplydiscountfunc будет “ничего” (подкласс может быть)
Если пользователь не существует, то «нет» возвращается, и любое дальнейшее взаимодействие с этим игнорирует полностью. Так что, если мы пройдем 2-й аргумент, ничего не происходит. А также никаких нулевых ошибок не бросается.
Но в том случае, когда пользователь на самом деле существует, мы можем попытаться передать 2-й аргумент для MaybeapPlydiscountFunc через «карту», чтобы выполнить функцию, как приведена ниже:
maybediscount.map (maybeapplydiscountfunc)!//ПРОБЛЕМА!
Ох! «Карта» не знает, как запустить функцию ( maybeapplydiscountfunc) Когда сама функция находится внутри A, может быть,!
Вот почему нам нужен другой интерфейс для решения этого сценария. Оказывается, это «AP»!
Шаг5: Давайте повторим функцию «AP». ” Метод AP “требует другого, может быть, монад и проходит/применяет функцию, которая в настоящее время хранится к тому, что может быть.
Таким образом, мы можем просто подать заявку («ap») maybeapplydiscountfunc.
maybeapplydiscountfunc. ап (Maybediscount)//Внутренне это делает следующее, потому что applydiscount - это хранить в этом. Объединение обертки MaybeapplydiscountFunc: maybediscount.map (applydiscount)//Теперь, если maybediscount фактически имеет скидку, то функция работает. Если MayBediscount Null, то ничего не происходит.
Чтобы подвести итоги, если у вас есть функция, которая имеет значение с несколькими параметрами, которые все могут быть нулевыми, вы сначала карри, затем поместите его внутри. Кроме того, также поместите все параметры в A, а затем использовать «AP» для запуска функции.
Функция Curryn
Мы знакомы с «карри». Он просто преобразует функцию, которая принимает несколько аргументов, чтобы взять их один за другим.
//Пример карри: const add = (A, B) = > A + B; const.curry (Add); const (10);//Передайте 1-й аргумент. Возвращает функцию, которая занимает 2-е (б) параметр.///Run Функция, передавая 2-й аргумент Add10 (2)//-> 12//Внутренне проходит «Добавить» с 10 и 2.
Но вместо того, чтобы добавлять только два числа, что если то Добавить Функция может подвести итоги всех чисел, переданных на него как аргумент?
const add = (… args) = > R.sum (args);//сумма всех чисел в args
Мы все еще можем карри его, ограничивая количество args, использующих Curryn. как ниже:
//Пример Curryn const add = (... args) = > R.sum (args);//curryn Пример: const add = (... args) => r.sum (args); const. Curryn (3, добавить); Const. Curryn (5, добавить); Const. Curryn (10, Add); Add3Numbers (1,2,3)//6 Add3Numbers (1)//Возвращает функцию, которая требует еще 2 параметра. Add3Numbers (1, 2)//Возвращает функцию, которая принимает еще 1 param.
Использование «Curryn», чтобы дождаться количества звонков функций
Допустим, мы хотим написать функцию, которая только входит в систему, если мы назовем это 3 раза (и игнорируем 1-й и 2-й вызов). Что-то вроде ниже:
//нечистый позволять; const logafter3calls = () => { Если (++ счетчик) Console.log («называется меня 3 раза»); } logafter3Calls ()//Ничего не происходит logafter3Calls ()//Ничего не происходит logafter3Calls ()//'называется мной 3 раза'
Мы можем имитировать, что используя Curryn, как ниже.
//чистые const log = () = > { Console.log («называется меня 3 раза»); } const.curryn (3, журнал); //звонить logafter3calls (”) (”) (”) //'называется мной 3 раза'//Примечание: мы проходим «чтобы удовлетворить Curryn, что мы передаем некоторое параметр.
Пример 4- Сбор и отображение нескольких ошибок
Темы охватывали: Валидация (aka “Валидационный функтор”, “Применение валидации”, “Валидация Монаде”) .
Валидации похожи на Либо монады и используется для работы с составлением нескольких функций бросков ошибок. Но в отличие от монады, где мы обычно используем его метод «цепочки», чтобы составить в монаде валидации, мы обычно используем метод «AP» для составляющей. И в отличие от метода «цепи», где мы собираем только 1-я ошибку, Метод «AP», особенно в валидационных монаде позволяет нам собирать все ошибки в массиве .
Они обычно используются в проверке формы, где мы можем захотеть показывать все ошибки одновременно.
Используйте корпус: У нас есть форма регистрации, которая проверяет имя пользователя, пароль и электронное письмо с использованием 3 функций (ISUSERNAMEVALID, ISPWDLENGECRORT и IEEMAILVALID. Нам нужно показать все 1, 2 или 3 ошибки, если они все происходят одновременно.
Хорошо, давайте посмотрим, как реализовать его, используя «Применение валидации».
Подобно «либо» монаде, у него есть две конструкторы: Успех а также Отказ . Это похожи на подклассы, которые каждый извлекает спецификацию.
Шаг 1: Для того, чтобы использовать проверку, все, что нам нужно сделать, это обернуть допустимые значения и ошибки внутри Успех а также Отказ Конструкторы (то есть создание экземпляров этих классов).
const ("data.validation ')//от Folktalejs Const. Успех Const. Провал const ('Ramda'); //вместо: Функция ISUSERNAMEVALID (A) { Вернуться/^(0|[1-9][0-9]*)$/.test(a)? [«Имя пользователя не может быть числом»]: A } //Использование: Функция ISUSERNAMEVALID (A) { Вернуться/^(0|[1-9][0-9]*)$/.test(a)? Провал ([«Имя пользователя не может быть номером»]): Успех (а) }
Шаг 2: Создайте фиктивную функцию для проведения успеха проверки.
const returnsuccess = () = > «Успех»;//просто возвращает успех
Шаг 3: Используйте Curryn, чтобы многократно применять «AP»
Проблема с «доп» состоит в том, что левая сторона должна быть функтором (или монадом), содержащим функция .
Например, скажем, мы хотим многократно применять «AP», как ниже. Это будет работать только, если Monad1 содержит функцию. И результат Monad1.ap (Monad2) я результингмонад Также является монадом с функцией, чтобы мы могли «AP» монад3.
let.ap (monad2) .ap (Monad3) //можно переписать как: let.ap (monad2) Пусть конечный результат .ap (Монад3) //работать только тогда, когда: monad1 имеет функцию и monad1.ap (monad2) приводит к другому монаде (результингмона) с функцией
В нашем случае у нас есть 3 функции, которые нам нужно подать заявку.
Допустим, мы сделали что-то вроде ниже.
Успех (возврат) . (ISUSERNAMEVALID (имя пользователя))//работает .ap (ispwdlengthcorrect (pwd))//не будет Работа . (адрес электронной почты действительный (электронная почта))//не будет Работа
Вышесказанное не будет работать, потому что успех (Returnsuccess) .AP (ISUSERNAMEVALID (имя пользователя)) приведет к значению. И мы больше не можем продолжать делать «AP» на 2-й и 3-й функции.
Войдите в Curryn.
Мы можем использовать Curryn, чтобы продолжать возврат функции, пока не называется «n» количество раз.
Итак, мы можем просто сделать:
//3 Coz Мы называем «AP» 3 раза. let.curry (3, возвратный успех);
Теперь, Curryed. Успех продолжает возвращать функцию 3 раза.
Функция Validateform (имя пользователя, PWD, Email) { //3 COZ. Мы называем «AP» 3 раза. let.curryn (3, returnsuccess); Возврат успеха (успех)//по умолчанию; используется для 3 "ap" s . (ISUSERNAMEVALID (имя пользователя)) .ap (ispwdlengthcorrect (pwd)) .ap (reeMailvalid (электронная почта)) }
Положить все это вместе:
Если вам понравилось сообщение, нажав на то? Это ниже и делясь его в Twitter! Спасибо за прочтение! ??
Мои другие сообщения
ПОСЛЕДНИЙ: Внутренняя работа браузера – для JavaScript и веб-разработчиков Используйте код: Inner15 и выньте 50%!
Функциональное программирование
- JavaScript Turing Complete – Объяснил
- Функциональное программирование в JS – с практическими примерами (часть 1)
- Функциональное программирование в JS – с практическими примерами (часть 2)
ES6
WebPack.
- WebPack – запутанные детали
- Замена WebPack & Hot модуль [HMR] ( под капотом)
- HMR и React-Hot-Loader WebPack – отсутствующее руководство
Проект
- Почему черновик и Почему вы должны внести свой вклад
- Как проект.js представляет богатые текстовые данные
Реагировать и redux:
- Шаг за шагом Руководство по созданию приложений React Redux
- Руководство для строительства A React Redux Crud App (3-страничное приложение)
- Использование Hedimwares в Action Redux Apps
- Добавление прочной проверки формы для реагирования приложений Redux
- Защита приложений React Redux с токенами JWT
- Обработка транзакционных электронных писем в Action Redux Apps
- Анатомия приложения React Redux
Salesforce.
Оригинал: “https://www.freecodecamp.org/news/functional-programming-in-js-with-practical-examples-part-2-429d2e8ccc9e/”