Функциональные особенности
Нет четкой границы того, что определяет функциональное программирование или функциональную библиотеку. Некоторые функции функциональных языков встроены в Javascript:
- Первоклассные функции высшего порядка
- Лямбда-выражения / анонимные функции с закрытием
Остальные можно выполнить с помощью Javascript с некоторой осторожностью:
- Неизменность
- Ссылочная прозрачность
Третьи являются частью ES6 и частично или полностью доступны прямо сейчас:
- Компактные, даже лаконичные функции
- Производительная рекурсия за счет оптимизации хвостового вызова
И есть много других, которые действительно выходят за рамки обычного Javascript:
- Сопоставление с образцом
- Ленивая оценка
- Гомоиконность
Таким образом, библиотека может выбирать, какие функции она пытается поддерживать, и при этом называться «функциональными».
Спецификация фэнтезийной страны
Страна фантазий - это спецификация для ряда стандартных типов, перенесенных из математической теории категорий и абстрактной алгебры в функциональное программирование, таких как Monoid , Functor и Monad . Эти типы довольно абстрактны и, возможно, расширяют более знакомые понятия. Функторы, например, контейнеры , которые могут быть map
PED над функцией, то , как массив может быть map
PED по сравнению с использованием Array.prototype.map
.
Сказка
Folktale - это набор типов, реализующих различные части спецификации Fantasy-land, и небольшой набор вспомогательных функций. Эти типы - это такие вещи, как Maybe , Either , Task (очень похоже на то, что в другом месте называется Future, и более законный родственник Promise) и Validation
Folktale - это, пожалуй, самая известная реализация спецификации Fantasy-land, и она пользуется большим уважением. Но не существует такой вещи, как окончательная реализация или реализация по умолчанию; Fantasy -land определяет только абстрактные типы, и реализация, конечно же, должна создавать такие конкретные типы. Претензия Folktale на то, чтобы быть функциональной библиотекой, очевидна: она предоставляет типы данных, обычно встречающиеся в языках функционального программирования, которые значительно упрощают функциональное программирование.
Этот пример из документации Folktale ( примечание : не в последних версиях документации) показывает, как его можно использовать:
var Maybe = require('data.maybe')
function find(predicate, xs) {
return xs.reduce(function(result, x) {
return result.orElse(function() {
return predicate(x)? Maybe.Just(x)
: Maybe.Nothing()
})
}, Maybe.Nothing())
}
var numbers = [1, 2, 3, 4, 5]
var anyGreaterThan2 = find(function(a) { return a > 2 }, numbers)
var anyGreaterThan8 = find(function(a) { return a > 8 }, numbers)
Рамда
Ramda (отказ от ответственности: я один из авторов) - это совершенно другой тип библиотеки. Он не предлагает вам новых типов. 1 Вместо этого он предоставляет функции, упрощающие работу с существующими типами. Он построен на принципах компоновки более мелких функций в более крупные, работы с неизменяемыми данными и предотвращения побочных эффектов.
Ramda работает в первую очередь со списками, но также и с объектами, а иногда и со строками. Он также делегирует многие из своих вызовов таким образом, чтобы он мог взаимодействовать с Folktale или другими реализациями Fantasy-Land. Например, map
функция Ramda работает так же , как и функция Array.prototype
, поэтому R.map(square, [1, 2, 3, 4]); //=> [1, 4, 9, 16]
. Но поскольку Folktale Maybe
реализует Functor
спецификацию Fantasy-land , которая также определяет карту, вы также можете использовать map
с ней Ramda :
R.map(square, Maybe.Just(5));
R.map(square, Maybe.Nothing);
Заявления Ramda о том, что это функциональная библиотека, заключаются в упрощении компоновки функций, без изменения ваших данных и в представлении только чистых функций. Типичным использованием Ramda было бы создание более сложных функций путем составления более мелких, как показано в статье о философии Ramda.
var userRatingForComments = R.pipe(
R.pluck('username')
R.map(R.propOf(users)),
R.pluck('rating'),
);
Другие библиотеки
На самом деле я нашел больше библиотек, все они, кажется, делятся на две категории. подчеркиваю, lodash очень похожи на Ramda. Страна фэнтези, фэнтези без точек похожи на сказку.
Это не совсем так. Прежде всего, Fantasy-land - это просто спецификация, которую библиотеки могут решить реализовать для различных типов. Folktale - одна из многих реализаций этой спецификации, вероятно, наиболее полная и, безусловно, одна из самых зрелых. Безупречная фантазия и рамда-фэнтези - это другие, и их гораздо больше .
Underscore и lodash внешне похожи на Ramda в том смысле, что они представляют собой универсальные библиотеки, предоставляющие большое количество функций с гораздо меньшей согласованностью, чем что-то вроде Folktale. И даже определенные функции часто совпадают с функциональностью Ramda. Но на более глубоком уровне у Ramda совсем другие задачи, чем у этих библиотек. Близкие кузены Ramda являются , вероятно , библиотеки FKit , Fnuc и Wu.js .
Билби находится в отдельной категории, предоставляя как ряд инструментов, таких как предоставленные Ramda, так и некоторые типы, совместимые с Fantasy-land. (Автор Билби также является первоначальным автором Страны фантазий.)
Ваш звонок
Все эти библиотеки имеют право называться функциональными, хотя они сильно различаются по функциональному подходу и степени функциональной приверженности.
Некоторые из этих библиотек действительно хорошо работают вместе. Ramda должна хорошо работать с Folktale или другими реализациями Fantasy Land. Поскольку их проблемы почти не пересекаются, они действительно не конфликтуют, но Ramda делает ровно столько, чтобы взаимодействие было относительно гладким. Это, вероятно, менее верно для некоторых других комбинаций, которые вы могли бы выбрать, но более простой синтаксис функций ES6 также может облегчить интеграцию.
Выбор библиотеки или даже стиля ее использования будет зависеть от вашего проекта и ваших предпочтений. Доступно множество хороших вариантов, и их количество растет, и многие из них значительно улучшаются. Хорошее время заняться функциональным программированием на JS.
1 Ну, есть побочный проект ramda-fantasy, делающий что-то похожее на то, что делает Folktale, но он не является частью основной библиотеки.