pourquoi les contes et ramda sont-ils si différents?

J’apprends javascript FP en lisant le livre de DrBoolean.

J’ai cherché autour de la bibliothèque de functional programming. J’ai trouvé Ramda et Folktale. Les deux prétendent être une bibliothèque de functional programming.

Mais ils sont tellement différents:

En fait, j’ai trouvé plus de bibliothèques, elles semblent toutes tomber dans les deux catégories. soulignement, lodash est très semblable à 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 d’elles une bibliothèque fonctionnelle?

Caractéristiques fonctionnelles

Il n’y a pas de limites claires de ce qui définit la functional programming ou une bibliothèque fonctionnelle. Certaines fonctionnalités des langages fonctionnels sont intégrées à Javascript:

  • Fonctions de première classe et d’ordre supérieur
  • Fonctions Lambdas / Anonymous, avec fermetures

D’autres sont possibles en Javascript avec quelques précautions:

  • Immutabilité
  • Transparence référentielle

D’autres encore font partie d’ES6 et sont partiellement ou totalement disponibles en ce moment:

  • Compact, voire lacunaire, fonctionne
  • Récursion performante par optimisation de l’appel de queue

Et il y en a beaucoup d’autres qui sont vraiment hors de scope de Javascript:

  • pattern matching
  • Évaluation paresseuse
  • Homoiconicité

Une bibliothèque peut alors choisir les types de fonctionnalités qu’elle essaie de prendre en charge et qu’elle peut toujours qualifier de «fonctionnelles».

Spécification terre fantastique

Fantasy-land est une spécification pour un certain nombre de types standard portés de la théorie des catégories mathématiques et de l’algèbre abstraite à la functional programming, tels que Monoid , Functor et Monad . Ces types sont assez abstraits et étendent des notions peut-être plus familières. Les foncteurs, par exemple, sont des conteneurs qui peuvent être map avec une fonction, comme un tableau peut être map en utilisant Array.prototype.map .

Conte populaire

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 Maybe , Either , Task (très similaire à ce qu’on appelle ailleurs un futur, et un cousin plus légitime à une promesse), et la validation

Folktale est peut-être l’implémentation la plus connue de la spécification Fantasy-land, et elle est très respectée. Mais il n’existe pas d’implémentation définitive ou par défaut; La terre fantastique ne spécifie que des types abstraits, et une implémentation doit bien sûr créer de tels types concrets. La prétention de Folktale à être une bibliothèque fonctionnelle est claire: elle fournit des types de données que l’on trouve généralement dans les langages de programmation fonctionnels, lesquels facilitent considérablement la functional programming.

Cet exemple, extrait de la documentation Folktale , montre comment il peut ê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

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 objects et parfois sur les cordes. Il délègue également nombre de ses appels de manière à interagir avec Folktale ou d’autres mises en œuvre de Fantasy-land. Par exemple, la fonction de map de Ramda fonctionne de manière similaire à celle de Array.prototype , donc R.map(square, [1, 2, 3, 4]); //=> [1, 4, 9, 16] R.map(square, [1, 2, 3, 4]); //=> [1, 4, 9, 16] . Mais parce que Maybe de Folktale implémente la spécification Functor -Land Functor , qui spécifie également la carte, vous pouvez également utiliser la map de Ramda avec:

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

Ramda prétend être une bibliothèque fonctionnelle en facilitant la composition des fonctions, en ne mutant jamais vos données et en ne présentant que des fonctions pures. L’utilisation typique de Ramda serait de construire des fonctions plus complexes en composant des plus petites, comme le montre un article sur la philosophie de Ramda.

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

Autres bibliothèques

En fait, j’ai trouvé plus de bibliothèques, elles semblent toutes tomber dans les deux catégories. soulignement, lodash est très semblable à 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 mises en œuvre de cette spécification, probablement la plus complète, certainement l’une des plus abouties. Pointfree-fantasy et ramda-fantasy sont d’autres, et il y en a beaucoup d’autres .

Le soulignement et le lodash ressemblent superficiellement à Ramda en ce qu’ils sont des bibliothèques à sac à main, offrant un grand nombre de fonctions avec beaucoup moins de cohésion que quelque chose comme Folktale. Et même les fonctionnalités spécifiques chevauchent souvent celles 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.)

Ton appel

Toutes ces bibliothèques ont le droit d’être qualifiées de fonctionnelles, même si leur approche fonctionnelle et leur degré d’engagement fonctionnel varient considérablement.

Certaines de ces bibliothèques fonctionnent bien ensemble. Ramda devrait bien fonctionner avec Folktale ou d’autres implémentations Fantasy-land. Comme leurs préoccupations se chevauchent à peine, elles ne sont pas vraiment en conflit, mais Ramda en fait juste assez pour rendre l’interopérabilité relativement fluide. Cela est probablement moins vrai pour certaines autres combinaisons que vous pourriez choisir, mais la syntaxe de la fonction plus simple de ES6 peut également réduire certaines des difficultés d’intégration.

Le choix de la bibliothèque, voire du 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 leur nombre augmente, et beaucoup d’entre elles s’améliorent grandement. C’est un bon moment pour faire de la functional programming dans JS.


1 Eh bien, il existe un projet parallèle , ramda-fantasy, qui fait quelque chose de similaire à ce que fait Folktale, mais qui ne fait pas partie de la bibliothèque principale.