Введение в I ❤ Ramda

Серия I ❤ Ramda будет немного отличаться от других, которые вы, возможно, видели. Вместо использования типичных foo, bar, baz примеров или статей, демонстрирующих изолированные функции, эта серия нацелена на демонстрацию реальных приложений Ramda.js.

Частичное приложение со специальным заполнителем

Если вы использовали bind, возможно, вы уже знакомы с концепцией частичного приложения.

Используя bind, мы смогли частично применить значение 2 к аргументу a в функции multiply, чтобы создать совершенно новую функцию double.

Вышеупомянутое решение (с bind) работает нормально, даже если нам нужно вызвать bind, а также передать его в контексте (в данном случае это null).

Частичное применение с карри

Ramda обрабатывает частичное приложение, используя функцию multiply.

Хорошо, теперь код ... другой, но вы не в восторге, и я понимаю. Но подождите, потому что магия 🧙 вот-вот начнется.

Где привязка терпит неудачу

Давайте рассмотрим этот пример, взглянем на строки 9 и 10…

Все вызовы readFile будут utf8, и теперь, когда я думаю об этом, все они также будут использовать одну и ту же функцию output.

В этом примере привязка не может использоваться, потому что bind будет применять аргументы только слева направо. Придется создать совершенно новую функцию.

Специальный заполнитель

У Ramda есть то, что они называют специальным заполнителем, который используется для частичного применения аргументов независимо от позиции.

Чтобы использовать этот специальный заполнитель, функция должна быть сначала каррирована.

Теперь, когда fs.readFile был каррирован в readFile, мы можем использовать специальный заполнитель Ramda (__) для аргумента имени файла и частично применить utf8 и output к readFile.

😍 Если на этом этапе вы не взволнованы, обратитесь к врачу, потому что внутри вы мертвы.

Давайте закончим этот пример рефакторингом.

readFile также можно использовать так, потому что теперь у нас больше возможностей!

Домашнее задание

Лучший способ научиться - это делать 😉. Итак, для этого упражнения попробуйте создать две новые функции fetchGet и fetchPost на основе функции fetch.

Если вам нужна помощь, задавайте вопросы в разделе комментариев, я постараюсь ответить на все вопросы!

Что еще мы можем сделать?

Вот упрощенный фрагмент из проекта, над которым я работаю. Сначала я вставлю tokenContract, чтобы вы также могли запустить этот пример.

Опять же, не вдавайтесь в подробности этой части кода, это просто настройка. Но обратите внимание на то, как функция curry используется ниже.

А теперь мясо 🍖

Карри и частичное применение позволили нам обрезать i => и , i концы нашей функции внутри then. Это шаблон, который вы будете встречать часто. Единственный аргумент, переданный из функции then (в данном случае это i), станет последним аргументом функции, вызываемой в tokenContract.getTokenAtIndex.

Дальнейшие исследования: процесс исключения i в конце называется бессмысленным или неявным программированием, аргумент i является «точкой».

И поскольку я знаю, что работа, которую я делаю, всегда будет для account, я могу применить значение account к обеим функциям.

Дополнительный кредит

Композиция функций будет рассмотрена в следующих статьях, но сейчас я хотел бы оставить это в качестве дополнительной награды, чтобы вы исследовали и поработали:

Резюме

В этой статье кратко рассматриваются частичное приложение, каррирование и даже композиция функций. Посетите Ramda, чтобы узнать больше. Задавайте вопросы в комментариях, отвечу на каждый вопрос!

Если вам это показалось интересным, у меня есть больше статей на Medium и dev.to.

Подпишитесь на Twitter, Medium, dev.to и steemit или joel.net, чтобы получать уведомления о будущих статьях.

Ваше здоровье!

Изначально размещено на github