Функціональні особливості
Не існує чітко визначеної межі того, що визначає функціональне програмування чи функціональну бібліотеку. У Javascript вбудовано деякі особливості функціональних мов:
- Першокласні функції вищого порядку
- Функції лямбда / анонім, із закриттям
Інші можливості можна виконати в Javascript з певною обережністю:
- Незмінність
- Довідкова прозорість
Інші є частиною ES6 і частково або повністю доступні зараз:
- Компактні, навіть стислі функції
- Рекурсія виконання завдяки оптимізації зворотного виклику
І є багато інших, які насправді виходять за рамки звичайного досяжності Javascript:
- Відповідність шаблону
- Ледача оцінка
- Гомоіконічність
Тоді бібліотека може вибирати ті функції, які вона намагається підтримувати, і все ще обгрунтовано їх можна назвати "функціональними".
Специфікація фантастичної землі
Fantasy-земля є специфікацією для ряду стандартних типів , перенесених з математичної теорії категорій і загальна алгебри для функціонального програмування, таких типів, як Monoid , функтор і Монада . Ці типи досить абстрактні і поширюють, можливо, більш звичні поняття. Наприклад, функтори - це контейнери, які можна переглядати map
за допомогою функції, як можна обробляти масив map
за допомогоюArray.prototype.map
.
Народна казка
Folktale - це колекція типів, що реалізують різні частини специфікації Fantasy-land та невелика колекція супутніх функцій корисності. Це такі речі, як " Можливо" , " Або" , " Завдання" (дуже схоже на те, що в інших місцях називається "Майбутнє", і більш законний двоюрідний брат "Обіцянку"), і " Валідація"
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
Рамда
Рамда (застереження: я один з авторів) - це зовсім інший тип бібліотеки. Він не надає нових типів для вас. 1 Натомість він надає функції, що полегшують роботу з існуючими типами. Він побудований навколо уявлень про складання менших функцій у більші, про роботу з незмінними даними, про уникнення побічних ефектів.
Рамда працює особливо на списках, але також на об'єктах, а іноді і на струнах. Він також делегує багато своїх дзвінків таким чином, що він буде взаємодіяти з Folktale або іншими реалізаціями Fantasy-land. Наприклад, map
функція Рамди працює так само , як і функція on Array.prototype
, таким чином R.map(square, [1, 2, 3, 4]); //=> [1, 4, 9, 16]
. Але оскільки Folktale's Maybe
реалізує Functor
специфікацію Fantasy-land , яка також визначає карту, ви також можете використовувати map
з нею Ramda :
R.map(square, Maybe.Just(5)); //=> Maybe.Just(25);
R.map(square, Maybe.Nothing); //=> Maybe.Nothing
Претензії Рамди як функціональної бібліотеки полягають у спрощенні складання функцій, ніколи не мутують ваші дані і представляють лише чисті функції. Типовим використанням Рамди було б створення більш складних функцій шляхом складання менших, як видно з статті про філософію Рамди
// :: [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-fantasy - це інші, а їх набагато більше .
Підкреслення та лодаш зовні нагадують Рамду, оскільки вони є бібліотеками для захоплення, забезпечуючи велику кількість функцій з набагато меншою згуртованістю, ніж щось на зразок Folktale. І навіть конкретна функціональність часто накладається на функцію Рамди. Але на більш глибокому рівні Рамда сильно відрізняється від цих бібліотек. Близько кузени Ramda є , ймовірно , бібліотеки FKit , Fnuc і Wu.js .
Білбі є власною категорією, що надає як ряд інструментів, таких як Рамда, так і деякі типи, що відповідають Fantasy-land. (Автор Білбі також є оригінальним автором Fantasy-land.)
Твій дзвінок
Усі ці бібліотеки мають право називатися функціональними, хоча вони сильно відрізняються за функціональним підходом та ступенем функціональної відданості.
Деякі з цих бібліотек насправді добре працюють разом. Рамді слід добре працювати з Folktale чи іншими реалізаціями Fantasy-land. Оскільки їхні занепокоєння ледве перекриваються, вони дійсно не конфліктують, але Рамда робить це достатньо, щоб зробити взаємодію відносно гладкою. Це, мабуть, менш вірно для деяких інших комбінацій, які ви можете вибрати, але простіший синтаксис функцій ES6 також може позбавити біль від інтеграції.
Вибір бібліотеки чи навіть стилю бібліотеки для використання буде залежати від вашого проекту та ваших уподобань. Є багато хороших варіантів, і кількість зростає, і багато з них значно покращуються. Настав час зайнятися функціональним програмуванням у JS.
1 Ну, є побічний проект, ramda фантазії робити що - щось подібне до того , що робить Народна казка, але це не є частиною основної бібліотеки.