Функциональный JavaScript с Ramda


Ramda — это библиотека функций, призванная сделать функциональное программирование на JavaScript простым и мощным, но не менее похожим на JavaScript.

Рамда — это имя — шутка, основанная на lamb-da, как в исчислении лямбда, и на баранине, как у молодой овцы, и на Раме, как в овце. Он направлен на добавление функционального программирования в JavaScript без изменения его характера и ощущений. Такой подход «работы с языком» — это то, что вы оцените, если вам действительно нравится JavaScript. В JavaScript есть множество аспектов, которые делают его похожим на функциональный язык, но ему не хватает нескольких важных функций, наиболее важной из которых является автоматическое каррирование.

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

Например, в Ramda метод prop (p, obj) возвращает указанное свойство p объекта obj. Например:

значение var = R.prop (‘myProperty’, obj);

возвращает значение obj.myProperty, поскольку указаны оба параметра. Однако если вы напишете:

var getprop = R.prop (‘myProperty’);

тогда prop создается для создания новой функции, которая возвращает значение myProperty для указанного объекта, например.

значение var = getprop (obj);

возвращает obj.myProperty.

Каррирование — это то, на что вы приходите полагаться в функциональном программировании, поскольку он предоставляет способ создания новых функций с использованием композиции. Например, add (a, b) складывает два числа, а mult (a, b) умножает их. Таким образом, вы можете использовать композицию и автокаррирование для создания новой функции:

var plusonetimestwo = R.compose (R.mult (2), R.add (1));

Композиция применяет функции одну за другой, при необходимости с автоподстановкой. Первая функция add каррирована для создания функции добавления единицы, затем функция mult каррирована для создания функции умножения на 2, и это применяется к функции добавления единицы. Это:

R.mult (2, R.add (1, arg));

где arg — единственный оставшийся параметр.

Итак, в этом случае, если вы напишете

значение var = plusonetimetwo (3);

ты получаешь

R.mult (2, R.add (1,3));

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

Уже существуют библиотеки функциональных стилей для JavaScript — наиболее известны Underscore и Lodash, — но Ramda утверждает, что ее способ работы обеспечивает лучшую и более эффективную форму функционального программирования. В частности, при разработке методов он использует подход, основанный на функции. Это означает, что большинство методов принимают любые необходимые функции в качестве первого параметра, что значительно упрощает композицию.

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

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


Добавить комментарий