Подтвердить что ты не робот

Почему сказки и раманда настолько разные?

Я изучаю javascript FP, читая книгу DrBoolean.

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

Но они такие разные

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

  • Однако Folktale не содержит никакой утилиты для списка или функций. Кажется, что в javascript реализованы некоторые алгебраические структуры, такие как monad: Maybe, Task...

На самом деле я нашел больше библиотек, они все, кажется, попадают в две категории. Подчеркнем, Лодаш очень похож на Рамду. Фэнтези-лэнд, бессмысленные фэнтези похожи на сказку.

Можно ли назвать эти очень разные библиотеки функциональными, и если да, то что делает каждую из них функциональной библиотекой?

4b9b3361

Ответ 1

Функциональные возможности

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

  • Первоклассные функции более высокого порядка
  • Функции Lambdas/Anonymous, с закрытием

Другие можно выполнить в Javascript с некоторой осторожностью:

  • Неизменность
  • Ссылочная прозрачность

Остальные являются частью ES6 и частично или полностью доступны прямо сейчас:

  • Компактные, даже краткие функции
  • Выполнение рекурсии с помощью оптимизации хвостового вызова

И есть много других, которые действительно недоступны Javascript:

  • Соответствие шаблону
  • ленивая оценка
  • Homoiconicity

Затем библиотека может выбирать и выбирать, какие функции она пытается поддерживать и все же разумно называть "функциональными".

Спецификация Fantasy-land

Fantasy-land является спецификацией ряда стандартных типов, перенесенных из математической теории категорий и абстрактной алгебры в функциональное программирование, таких как Monoid, Functor и Monad. Эти типы довольно абстрактны и распространяются, возможно, более знакомые понятия. Например, функторы представляют собой контейнеры, которые могут быть map переброшены с помощью функции, способ, которым массив может быть map переделан с помощью Array.prototype.map.

Народная сказка

Folktale представляет собой набор типов, реализующих различные части спецификации Fantasy-land и небольшую коллекцию вспомогательных функций. Эти типы - это такие, как Maybe, Either, Task (очень похоже на то, что в другом месте называется "Будущее", и более законный кузен к обещанию), и Validation

Folktale - это, пожалуй, самая известная реализация спецификации Fantasy-land, и она пользуется большим уважением. Но нет такой вещи, как окончательная или стандартная реализация; fantasy-land определяет только абстрактные типы, а реализация, конечно же, должна создавать такие конкретные типы. "Folktale" заявляет, что является функциональной библиотекой: она предоставляет типы данных, которые обычно встречаются на языках функционального программирования, которые существенно упрощают программирование в функциональном режиме.

В этом примере из документации 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.Nothing

Ramda

Ramda (отказ от ответственности: я один из авторов) - это совсем другой тип библиотеки. Он не предоставляет вам новые типы. 1 Вместо этого он предоставляет функции, облегчающие работу с существующими типами. Он построен вокруг понятий составления меньших функций в более крупных, работы с неизменяемыми данными, предотвращения побочных эффектов.

Ramda работает особенно в списках, но также и на объектах, а иногда и на строках. Он также делегирует многие из своих вызовов таким образом, что он будет взаимодействовать с Folktale или другими реалиями Fantasy-land. Например, функция Ramda map работает аналогично функции на Array.prototype, поэтому R.map(square, [1, 2, 3, 4]); //=> [1, 4, 9, 16]. Но поскольку Folktale Maybe реализует спецификацию Fantasy-land Functor, которая также указывает карту, вы также можете использовать Ramda map с ней:

R.map(square, Maybe.Just(5)); //=> Maybe.Just(25);
R.map(square, Maybe.Nothing); //=> Maybe.Nothing

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

// :: [Comment] -> [Number]  
var userRatingForComments = R.pipe(
    R.pluck('username')      // [Comment] -> [String]
    R.map(R.propOf(users)),  // [String] -> [User]
    R.pluck('rating'),       // [User] -> [Number]
);

Другие библиотеки

На самом деле я нашел больше библиотек, все они попадают в две категории. подчеркивают, lodash очень похожи на Ramda. Fantasy-land, pointfree-fantasy - это как сказка.

Это не очень точно. Прежде всего, Fantasy-land - это просто спецификация, которую библиотеки могут решить реализовать для разных типов. Folktale - одна из многих реализаций этой спецификации, вероятно, самая лучшая, безусловно, одна из самых зрелых. Pointfree-fantasy и ramda-fantasy являются другими, и есть еще много.

Underscore и lodashповерхностно похожи на Ramda, поскольку они являются библиотеками grab-bag, предоставляя множество функций с гораздо меньшей связностью, чем что-то вроде Folktale. И даже специфическая функциональность часто перекрывается с Ramda. Но на более глубоком уровне у Рамды очень разные проблемы со стороны этих библиотек. Ближайшие кузены Рамды, вероятно, являются библиотеками вроде FKit, Fnuc и Wu.js.

Bilby находится в своей собственной категории, предоставляя как ряд инструментов, таких как предоставляемые Ramda, так и некоторые типы, совместимые с Fantasy-land. (Автор Бильби также является оригинальным автором Земли Фантазии.)

Ваш вызов

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

Некоторые из этих библиотек действительно хорошо работают вместе. Рамда должен хорошо работать с Folktale или другими реалиями Fantasy-land. Поскольку их проблемы едва совпадают, они действительно не конфликтуют, но Рамда делает это достаточно, чтобы сделать взаимодействие относительно плавным. Это, вероятно, менее верно для некоторых других комбинаций, которые вы могли бы выбрать, но простой синтаксис ES6 ES6 также может отвлечь часть боли от интеграции.

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


1 Ну, есть побочный проект ramda-fantasy, который делает что-то похожее на то, что делает Folktale, но это не часть основная библиотека.

Ответ 2

Чудесный ответ даже через 3 года прошло.