J'apprends javascript FP en lisant DrBoolean's book .
J'ai cherché une bibliothèque de programmation fonctionnelle. J'ai trouvé Ramda et Folktale. Les deux prétendent être une bibliothèque de programmation fonctionnelle.
Mais ils sont tellement différents:
Ramda semble contenir des fonctions utilitaires pour traiter la liste: cartographier, réduire, filtrer et les fonctions pures: curry, composer. Il ne contient rien pour gérer la monade, foncteur.
Folktale ne contient cependant aucun utilitaire pour la liste ou les fonctions. Il semble implémenter certaines structures algébriques en javascript comme monad: Peut-être, Task ...
En fait, j'ai trouvé plus de bibliothèques, elles semblent toutes tomber dans les deux catégories. souligner, lodash sont très similaires à Ramda. Fantasy-land, pointfree-fantasy sont comme des contes populaires.
Ces bibliothèques très différentes peuvent-elles toutes deux être appelées fonctionnelles , et si oui, qu'est-ce qui fait de chacune une bibliothèque fonctionnelle?
Il n'y a pas de limite claire de ce qui définit la programmation fonctionnelle ou une bibliothèque fonctionnelle. Certaines fonctionnalités des langages fonctionnels sont intégrées à Javascript:
D'autres sont possibles à réaliser en Javascript avec un certain soin:
D'autres encore font partie d'ES6, et sont partiellement ou totalement disponibles en ce moment:
Et il y en a beaucoup d'autres qui sont vraiment hors de portée normale de Javascript:
Une bibliothèque peut donc choisir quelles sortes de fonctionnalités elle essaie de prendre en charge et être raisonnablement qualifiée de "fonctionnelle".
Fantasy-land est une spécification pour un certain nombre de types standard portés de la théorie mathématique des catégories et de l'algèbre abstraite à la programmation fonctionnelle, des types tels que Monoïde , Functor et Monade . Ces types sont assez abstraits et étendent éventuellement des notions plus familières. Les foncteurs, par exemple, sont des conteneurs qui peuvent être map
ped avec une fonction, comme un tableau peut être map
ped avec Array.prototype.map
.
Folktale est une collection de types implémentant diverses parties de la spécification Fantasy-land et une petite collection de fonctions utilitaires complémentaires. Ces types sont des choses comme Peut-être , Soit , Tâche (très similaire à ce qu'on appelle ailleurs un Futur, et un cousin plus légal d'une Promesse ), et Validation
Folktale est peut-être l'implémentation la plus connue de la spécification Fantasy-land, et elle est bien respectée. Mais il n'y a rien de tel qu'une implémentation définitive ou par défaut; fantasy-land ne spécifie que des types abstraits, et une mise en œuvre doit bien sûr créer de tels types concrets. L'affirmation de Folktale d'être une bibliothèque fonctionnelle est claire: elle fournit des types de données trouvés généralement dans les langages de programmation fonctionnels, ceux qui facilitent considérablement la programmation de manière fonctionnelle.
Cet exemple, tiré de la documentation Folktale , montre comment il pourrait être utilisé:
// 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 (avertissement: je suis l'un des auteurs) est un type de bibliothèque très différent. Il ne fournit pas de nouveaux types pour vous.1 Au lieu de cela, il fournit des fonctions pour faciliter le fonctionnement sur les types existants. Il est construit autour des notions de composition de fonctions plus petites en fonctions plus grandes, de travail avec des données immuables, d'évitement des effets secondaires.
Ramda opère surtout sur les listes, mais aussi sur les objets, et parfois sur les chaînes. Il délègue également bon nombre de ses appels de manière à interagir avec Folktale ou d'autres implémentations Fantasy-land. Par exemple, la fonction map
de Ramda fonctionne de la même manière que celle sur Array.prototype
, Donc R.map(square, [1, 2, 3, 4]); //=> [1, 4, 9, 16]
. Mais comme Maybe
de Folktale implémente la spécification Fantasy-land Functor
, qui spécifie également la carte, vous pouvez également utiliser le map
de Ramda avec:
R.map(square, Maybe.Just(5)); //=> Maybe.Just(25);
R.map(square, Maybe.Nothing); //=> Maybe.Nothing
La prétention de Ramda à être une bibliothèque fonctionnelle réside dans le fait de faciliter la composition de fonctions, de ne jamais muter vos données et de présenter uniquement des fonctions pures. L'utilisation typique de Ramda serait de construire des fonctions plus complexes en en composant de plus petites, comme on le voit dans un article sur le philosophie de Ramda
// :: [Comment] -> [Number]
var userRatingForComments = R.pipe(
R.pluck('username') // [Comment] -> [String]
R.map(R.propOf(users)), // [String] -> [User]
R.pluck('rating'), // [User] -> [Number]
);
En fait, j'ai trouvé plus de bibliothèques, elles semblent toutes tomber dans les deux catégories. souligner, lodash sont très similaires à Ramda. Fantasy-land, pointfree-fantasy sont comme des contes populaires.
Ce n'est pas vraiment exact. Tout d'abord, Fantasy-land est simplement une spécification que les bibliothèques peuvent décider d'implémenter pour différents types. Folktale est l'une des nombreuses implémentations de cette spécification, probablement la plus complète, certainement l'une des plus matures. Pointfree-fantasy et ramda-fantasy sont d'autres, et il y a beaucoup plus .
nderscore et lodash sont superficiellement similaires à Ramda dans la mesure où ce sont des bibliothèques de grab-bag, fournissant un grand nombre de fonctions avec beaucoup moins de cohésion que quelque chose comme Folktale. Et même la fonctionnalité spécifique chevauche souvent celle de Ramda. Mais à un niveau plus profond, Ramda a des préoccupations très différentes de ces bibliothèques. Les cousins les plus proches de Ramda sont probablement des bibliothèques comme FKit , Fnuc et Wu.js .
Bilby est dans une catégorie à part, fournissant à la fois un certain nombre d'outils tels que ceux fournis par Ramda et certains types compatibles avec Fantasy-land. (L'auteur de Bilby est également l'auteur original de Fantasy-land.)
Toutes ces bibliothèques ont le droit d'être qualifiées de fonctionnelles, bien qu'elles varient considérablement dans l'approche fonctionnelle et le degré d'engagement fonctionnel.
Certaines de ces bibliothèques fonctionnent bien ensemble. Ramda devrait bien fonctionner avec Folktale ou d'autres implémentations Fantasy-land. Étant donné que leurs préoccupations se chevauchent à peine, elles ne sont vraiment pas en conflit, mais Ramda en fait juste assez pour rendre l'interopération relativement fluide. Cela est probablement moins vrai pour certaines des autres combinaisons que vous pourriez choisir, mais la syntaxe de fonction plus simple d'ES6 peut également alléger l'intégration.
Le choix de la bibliothèque, ou même le style de bibliothèque à utiliser, dépendra de votre projet et de vos préférences. Il y a beaucoup de bonnes options disponibles, et le nombre augmente, et beaucoup d'entre elles s'améliorent considérablement. C'est un bon moment pour faire de la programmation fonctionnelle dans JS.
1Eh bien, il y a un projet parallèle, ramda-fantasy faisant quelque chose de similaire à ce que fait Folktale, mais il ne fait pas partie de la bibliothèque principale.