почему сказка и рамда так отличаются?
Я изучаю javascript FP, читая Drboolean's книги.
Я искал библиотеку функционального программирования. Я нашел Рамду и сказку. Оба претендуют на функциональную библиотеку программирования.
но они такие разные:
Ramda Кажется, содержит служебные функции для работы со списком: map, reduce, filter и pure функции: curry, compose. Он не содержит ничего, чтобы иметь дело с монадой, функтор.
сказки однако не содержит никакой утилиты для списка или функций. Кажется, он реализует некоторые алгебраические структуры в javascript, такие как monad: Maybe, Task...
на самом деле я нашел больше библиотек, все они, кажется, попадают в две категории. подчеркиваю, лодаш очень похож на Рамду. Fantasy-land, pointfree-fantasy похожи на сказку.
могут ли эти очень разные библиотеки называться функциональное, и если да, то что делает каждый из них функциональной библиотекой?
1 ответ:
Функциональные Особенности
нет четкой границы того, что определяет функциональное программирование или функциональную библиотеку. Некоторые особенности функциональных языков встроены в Javascript:
- первоклассные функции высшего порядка
- лямбда / анонимные функции, с замыканиями
другие можно выполнить в Javascript с некоторыми уход:
- неизменяемости
- Референциальной Прозрачности
третьи являются частью ES6, и частично или полностью доступны прямо сейчас:
- компактные, даже краткие, функции
- рекурсия производительности через оптимизацию хвостового вызова
и есть много других, которые действительно находятся за пределами нормальной досягаемости Javascript:
- шаблон соответствие
- ленивый оценке
- Гомоиконичность
библиотека, таким образом, может выбирать, какие функции она пытается поддерживать и по-прежнему разумно называть "функциональными".
Fantasy-Land спецификация
Fantasy-land является спецификацией для ряда стандартных типов, перенесенных из математической теории категорий и абстрактной алгебры в функциональное программирование, таких как моноидом,функтор и монады. Эти типы довольно абстрактны и расширяют, возможно, более знакомые понятия. Функторы, например, являются контейнерами, которые могут быть
mapped с функцией, как массив может бытьmapped над использованиемArray.prototype.map.сказки
Folktale представляет собой набор типов, реализующих различные части спецификации Fantasy-land и небольшую коллекцию компаньонов функция полезности. Эти типы такие вещи, как может быть,или,задание (очень похоже на то, что в другом месте называется будущим, и более законным родственником обещания), и проверка
Folktale, пожалуй, самая известная реализация спецификации Fantasy-land, и она пользуется большим уважением. Но нет такой вещи, как окончательная или стандартная реализация; fantasy-land определяет только абстрактные типы, а an реализация, конечно, должна создавать такие конкретные типы. Притязания Folktale на то, чтобы быть функциональной библиотекой, ясны: она предоставляет типы данных, которые обычно находятся в функциональных языках программирования, которые существенно облегчают Программирование функциональным образом.
этот пример, из документация сказки, показывает, как он может быть использован:
// We load the library by "require"-ing it var Maybe = require('data.maybe') // Returns Maybe.Just(x) if some `x` passes the predicate test // Otherwise returns Maybe.Nothing() function find(predicate, xs) { return xs.reduce(function(result, x) { return result.orElse(function() { return predicate(x)? Maybe.Just(x) : /* otherwise */ Maybe.Nothing() }) }, Maybe.Nothing()) } var numbers = [1, 2, 3, 4, 5] var anyGreaterThan2 = find(function(a) { return a > 2 }, numbers) // => Maybe.Just(3) var anyGreaterThan8 = find(function(a) { return a > 8 }, numbers) // => Maybe.NothingRamda
Ramda (отказ от ответственности: я один из авторов) является очень разный тип библиотеки. Он не предоставляет новые типы для вас.1 вместо этого он предоставляет функции, облегчающие работу с существующими типами. Он построен на понятиях объединения меньших функций в более крупные, работы с неизменяемыми данными, избежания побочных эффектов.
Ramda работает особенно на списках, но и на объектах, а иногда и на строках. Он также делегирует многие из своих призывов таким образом, что он будет взаимодействовать с Сказка или другие фантазии-земельные воплощения. Например, Рамда
mapфункция, работает аналогично одному наArray.prototype, так чтоR.map(square, [1, 2, 3, 4]); //=> [1, 4, 9, 16]. Но потому что сказкаMaybeреализует Fantasy-landFunctorspec, который также определяет карту, вы также можете использовать RamdamapСR.map(square, Maybe.Just(5)); //=> Maybe.Just(25); R.map(square, Maybe.Nothing); //=> Maybe.Nothingпретензии Ramda на то, чтобы быть функциональной библиотекой, заключаются в том, чтобы легко создавать функции, никогда не мутировать ваши данные и представлять только чистые функции. Типичное использование Ramda было бы построить более сложную функцию, составляя меньшие, как видно из статьи о философия Ramda
// :: [Comment] -> [Number] var userRatingForComments = R.pipe( R.pluck('username') // [Comment] -> [String] R.map(R.propOf(users)), // [String] -> [User] R.pluck('rating'), // [User] -> [Number] );Другие Библиотеки
на самом деле я нашел больше библиотек, все они, кажется, попадают в две категории. подчеркиваю, лодаш очень похож на Рамду. Fantasy-land, pointfree-fantasy похожи на сказку.
это не совсем точный. Прежде всего, Fantasy-land-это просто спецификация, которая библиотеки могут использовать для различных видов. Folktale - одна из многих реализаций этой спецификации, вероятно, самая округлая, безусловно, одна из самых зрелых. Pointfree-fantasy и ramda-фэнтези и есть много.
подчеркивание и лодашь внешне похожи на Ramda в том, что они представляют собой библиотеки grab-bag, обеспечивающие большое количество функций с гораздо меньшей сплоченностью, чем что-то вроде сказки. И даже конкретная функциональность часто перекрывается с Ramda, но на более глубоком уровне Ramda имеет очень разные проблемы с этими библиотеками. Ближайшие родственники рамды, вероятно, библиотеки, как FKit,Fnuc и Ву.js.
Билби в категории собственный, предоставляя ряд инструментов таких как те, которые есть в Ramda и некоторые типы в соответствии с фантазий. (Автор Билби также является оригинальным автором Fantasy-land.)
Ваш Звонок
все эти библиотеки имеют право называться функциональными, хотя они сильно различаются по функциональному подходу и степени функциональной приверженности.
некоторые из этих библиотек на самом деле хорошо работают вместе. Ramda должен хорошо работать с Folktale или другими реализациями Fantasy-land. Поскольку их проблемы едва перекрываются, они действительно не конфликтуйте, но Ramda делает достаточно, чтобы сделать взаимодействие относительно гладким. Это, вероятно, менее верно для некоторых других комбинаций, которые вы могли бы выбрать, но более простой синтаксис функции ES6 также может снять часть боли от интеграции.
выбор библиотеки, или даже стиль библиотеки, чтобы использовать, будет зависеть от вашего проекта и ваших предпочтений. Есть много хороших вариантов, и их число растет, и многие из них значительно улучшаются. Это хорошее время, чтобы делать функциональное программирование на JS.
1Ну, есть побочный проект,ramda-фэнтези делает что-то похожее на то, что делает Folktale, но это не часть основной библиотеки.
Comments