Мы в rangle.io давно увлекаемся функциональным программированием, и уже опробовали Underscore и Lodash. Но недавно мы наткнулись на библиотеку Ramda, которая на первый взгляд похожа на Underscore, но отличается в небольшой, но важной области. Ramda предлагает примерно тот же набор методов, что и Underscore, но так организовывает работу с ними, что функциональная композиция становится легче.
Разница между Ramda и Underscore – в двух ключевых местах – каррирование и композиция.
Недавно я познакомился с замечательной серией статей "Thinking in Ramda", которые проясняют на простых и ясных примерах способы написания кода в функциональном стиле с использованием библиотеки Ramda. Эти статьи показались мне настолько прекрасными, что я не смог удержаться от того, чтобы не перевести их на русский язык. Надеюсь, что в этом будет польза для многих людей :) Давайте начнём перевод с первой вступительной статьи.
Данный пост — это начало серии статей «Мышление в стиле Ramda» о функциональном программировании.
Я буду использовать библиотеку Ramda в этих статьях, хотя многие из обсуждаемых идей применимы также к множеству других библиотек, таких как Underscore и Lodash, а также к другим языкам программирования.
Я буду придерживаться лёгкой, менее академической стороны функционального программирования. Это в основном потому что я хочу, чтобы серия была доступна большему числу людей, но также частично и потому что я сам не так близок к истинно функциональной дороге.
В первой части я представил Ramda и некоторые основополагающие идеи от функционального программирования, такие как функции, чистые функции и иммутабельность. Далее я предположил, что хорошим местом для начала являются итерационные функции, такие как forEach, map, select и их друзья.
Во второй части мы говорили о сочетании функций различным образом, закончив на функциях compose и pipe, которые позволяют использовать серию функций в режиме конвеера.
В том посте мы рассмотрели простые конвееры функций, которые принимают лишь один аргумент. Но что если мы хотим использовать такие функции, которые принимают больше одного аргумента?
Пост содержит перевод статьи «Why Ramda?», которую подготовил один из контрибьютеров Скот Сайет. Статья была опубликована 10 Июня 2014 года на сайте и рассказывает о том почему стоит обратить своё внимание на библиотеку Ramda и функциональное программирование в целом.
Примечание переводчика
В связи с тем, что статья была написана в 2014 году, некоторые примеры устарели и не работали с последней версией библиотеки. Поэтому они были адаптированы под последнюю версию Ramda@0.25.0.
Почему Ramda?
Когда-то давно buzzdecafe представил миру Ramda, в тот же момент сообщество поделилось на два лагеря.
Данный пост является четвёртой частью серии о функциональном програмировании под названием «Мышление в стиле Ramda».
В третьей части мы говорили об объединении функций, которые могут принимать больше одного аргумента, используя техники частичного применения и каррирования.
Когда мы начинаем писать маленькие функциональные строительные блоки и объединять их, мы обнаруживаем, что нам необходимо написать множество функций, которые будут оборачивать операторы JavaScript, такие как арифметика, сравнение, логика и управление потоком. Это может показаться утомительным, но мы находимся за спиной Ramda.
Данный пост — это пятая часть серии статей о функциональном программировании под названием "Мышление в стиле Ramda".
В четвёртой части мы говорили о написании кода в декларативном стиле (объясняем компьютеру что нужно сделать) вместо императивного (говорим ему, как это сделать).
Вы могли заметить, что некоторые из функций, которые мы написали (forever21, drivingAge и water, к примеру) все принимают параметр, создают новую функцию и применяют эту функцию к параметру.
Это очень распространённый паттерн в функциональном программировании, и Ramda здесь в очередной раз предоставляет нам утилиты для того чтобы ещё немного очистить наш код.
Данный пост — это шестая часть серии статей о функциональном программировании под названием "Мышление в стиле Ramda".
В пятой части мы говорили о написании функций в стиле бесточечной нотации, где главный аргумент с данными для нашей функции не указывается явным образом.
На тот момент времени мы не могли переписать все наши функции в бесточечный стиль, потому что у нас не было некоторых необходимых для этого инструментов. Настало время для того чтобы изучить их.
Данный пост — это восьмая часть серии статей о функциональном программировании под названием "Мышление в стиле Ramda".
В шестой и седьмой частях мы изучили, как читать, обновлять и трансформировать свойства объектов и элементы массивов в декларативном и иммутабельном стиле.
Ramda также предоставляет более общий инструмент для выполнения данных операций, который называется линзами.
Данный пост завершает серию статей о функциональном программировании под названием "Мышление в стиле Ramda".
В последние восемь постов мы говорили о JavaScript библиотеке Ramda, которая предоставляет функции для работы с JavaScript в функциональном, декларативном и иммутабельном стиле.
В течении этой серии статей, мы узнали, что Ramda имеет несколько основных принципов, которыми движется её API:
Данные идут последними: почти все функции принимают параметр с данными последним аргументом.
Каррирование: почти каждая функция в Ramda "каррирована". То есть, вы можете вызвать функцию только с частью неоходимых аргументов, и получить новую функцию, которая будет ожидать оставшиеся аргументы. Как только все аргументы будут предоставлены — оригинальная функция будет вызвана.
Эти два принципа позволяют нам писать очень чистый функциональный код, который объединяет базовые строительные блоки в более мощные операции.