Estoy aprendiendo FP de JavaScript leyendo el libro de DrBoolean .
Busqué una biblioteca de programación funcional. Encontré a Ramda y Folktale. Ambos afirman ser una biblioteca de programación funcional.
Pero son tan diferentes:
Ramda parece contener funciones de utilidad para lidiar con listas: mapear, reducir, filtrar y funciones puras: curry, componer. No contiene nada relacionado con la mónada, functor.
Sin embargo, Folktale no contiene ninguna utilidad para listas o funciones. Parece implementar algunas estructuras algebraicas en javascript como monad: Maybe, Task ...
En realidad encontré más bibliotecas, todas parecen caer en las dos categorías. El subrayado y lodash son como Ramda. La tierra de la fantasía, la fantasía sin sentido son como un cuento popular.
¿Pueden estas bibliotecas tan diferentes ser llamadas funcionales y, de ser así, qué hace que cada una sea una biblioteca funcional?
fuente
[1,2,3].map(fnSquare).reduce(fnSum)
2. Estructuras en gran parte académicas "look ma no var " Y-combinator-esque. 3. usarFunction.prototype
para modificar el comportamiento de otras funciones, comovar isMissingID=fnContains.partial("id").negate();
Respuestas:
Características funcionales
No existe un límite claro de lo que define la programación funcional o una biblioteca funcional. Algunas características de los lenguajes funcionales están integradas en Javascript:
Otros son posibles de lograr en Javascript con cierto cuidado:
Otros son parte de ES6 y están disponibles total o parcialmente en este momento:
Y hay muchos otros que están realmente más allá del alcance normal de Javascript:
Una biblioteca, entonces, puede elegir qué tipo de características está tratando de admitir y aún así, razonablemente, llamarse "funcionales".
Especificación de la tierra de la fantasía
Fantasy-land es una especificación para varios tipos estándar transferidos desde la teoría de categorías matemáticas y el álgebra abstracta a la programación funcional, tipos como Monoid , Functor y Monad . Estos tipos son bastante abstractos y amplían posiblemente nociones más familiares. Los functores, por ejemplo, son contenedores que se pueden
map
sobrepasar con una función, de la misma forma en que se puedemap
sobrepasar una matrizArray.prototype.map
.Cuento popular
Folktale es una colección de tipos que implementan varias partes de la especificación Fantasy-land y una pequeña colección de funciones de utilidad complementarias. Estos tipos son cosas como Quizás , O bien , Tarea (muy similar a lo que en otros lugares se llama Futuro y un primo más legal de una Promesa) y Validación
Folktale es quizás la implementación más conocida de la especificación Fantasy-land, y es muy respetada. Pero no existe una implementación definitiva o predeterminada; Fantasy-land solo especifica tipos abstractos, y una implementación, por supuesto, debe crear tales tipos concretos. La afirmación de Folktale de ser una biblioteca funcional es clara: proporciona tipos de datos que se encuentran típicamente en lenguajes de programación funcionales, que hacen que sea sustancialmente más fácil programar de manera funcional.
Este ejemplo, de la documentación de Folktale ( nota : no en las versiones recientes de los documentos), muestra cómo podría usarse:
Ramda
Ramda (descargo de responsabilidad: soy uno de los autores) es un tipo de biblioteca muy diferente. No le proporciona nuevos tipos. 1 En cambio, proporciona funciones para facilitar la operación en tipos existentes. Se basa en las nociones de componer funciones más pequeñas en funciones más grandes, de trabajar con datos inmutables, de evitar efectos secundarios.
Ramda opera especialmente en listas, pero también en objetos y, a veces, en cadenas. También delega muchas de sus llamadas de tal manera que interoperará con Folktale u otras implementaciones de Fantasy-land. Por ejemplo, la
map
función de Ramda opera de manera similar a la de encendidoArray.prototype
, entoncesR.map(square, [1, 2, 3, 4]); //=> [1, 4, 9, 16]
. Pero debido a que Folktale'sMaybe
implementa laFunctor
especificación Fantasy-land , que también especifica el mapa, también puedes usar la de Ramdamap
con ella:Las afirmaciones de Ramda de ser una biblioteca funcional radican en facilitar la composición de funciones, nunca mutar sus datos y presentar solo funciones puras. El uso típico de Ramda sería desarrollar funciones más complejas componiendo funciones más pequeñas, como se ve en un artículo sobre la filosofía de Ramda.
Otras bibliotecas
Eso no es realmente exacto. En primer lugar, Fantasy-land es simplemente una especificación que las bibliotecas pueden decidir implementar para varios tipos. Folktale es una de las muchas implementaciones de esa especificación, probablemente la mejor completa, sin duda una de las más maduras. Pointfree-fantasy y ramda-fantasy son otros, y hay muchos más .
Subrayado y lodash son superficialmente como Ramda en el sentido de que son bibliotecas de bolsa de mano, que proporcionan una gran cantidad de funciones con mucha menos cohesión que algo como Folktale. E incluso la funcionalidad específica a menudo se superpone con la de Ramda. Pero a un nivel más profundo, Ramda tiene preocupaciones muy diferentes de esas bibliotecas. Primos más cercanos de Ramda son probablemente las bibliotecas como FKit , Fnuc y Wu.js .
Bilby está en una categoría propia, proporcionando tanto una serie de herramientas como las proporcionadas por Ramda como algunos tipos compatibles con Fantasy-land. (El autor de Bilby es el autor original de Fantasy-land también).
Tu llamada
Todas estas bibliotecas tienen derecho a ser llamadas funcionales, aunque varían mucho en el enfoque funcional y el grado de compromiso funcional.
Algunas de estas bibliotecas funcionan bien juntas. Ramda debería funcionar bien con Folktale u otras implementaciones de Fantasy-land. Dado que sus preocupaciones apenas se superponen, realmente no entran en conflicto, pero Ramda hace lo suficiente para que la interoperación sea relativamente fluida. Esto probablemente sea menos cierto para algunas de las otras combinaciones que podría elegir, pero la sintaxis de función más simple de ES6 también puede aliviar parte del dolor de la integración.
La elección de la biblioteca, o incluso el estilo de la biblioteca a utilizar, dependerá de su proyecto y sus preferencias. Hay muchas buenas opciones disponibles, y los números están creciendo y muchas de ellas están mejorando enormemente. Es un buen momento para hacer programación funcional en JS.
1 Bueno, hay un proyecto paralelo, ramda-fantasy que hace algo similar a lo que hace Folktale, pero no es parte de la biblioteca principal.
fuente
yield
facilita el tipo de procesamiento de listas diferido realizado porLazy
olz.js
. Pero no ayuda con la pereza a nivel del idioma.someFunc(a + b)
en JS primero agrega los valores dea
yb
luego proporciona ese resultado como parámetro a someFunc. El equivalente en Haskell no hace eso. Si la función llamada nunca usa ese valor, nunca realiza la suma. Si finalmente lo usa, se considera una expresión a calcular hasta que se necesite su resultado. Si nunca hace nada que lo fuerce (como IO), nunca realizará el cálculo.