una tipos que popular partes novela literario estructura cuento caracteristicas javascript functional-programming ramda.js

javascript - tipos - ¿Por qué el cuento popular y la ramda son tan diferentes?



que es una novela (1)

Estoy aprendiendo javascript FP leyendo el book de DrBoolean.

Busqué por la biblioteca de programación funcional. Encontré a Ramda y Folktale. Ambos afirman ser una biblioteca de programación funcional.

Pero son muy diferentes:

  • Ramda parece contener funciones de utilidad para lidiar con la lista: mapa, reducir, filtrar y funciones puras: curry, componer. No contiene nada para tratar con mónada, functor.

  • Sin embargo, Folktale no contiene ninguna utilidad para lista o funciones. Parece implementar algunas estructuras algebraicas en javascript como mónada: Quizás, Tarea ...

En realidad encontré más bibliotecas, todas parecen caer en las dos categorías. subrayado, lodash son muy parecidos a Ramda. Fantasy-land, pointfree-fantasy son como cuentos populares.

¿Pueden estas bibliotecas tan diferentes llamarse funcionales y, de ser así, qué hace que cada una sea una biblioteca funcional?


Caracteristicas 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:

  • Funciones de primer orden de primer orden
  • Funciones lambdas / anónimas, con cierres

Otros son posibles de realizar en Javascript con cuidado:

  • Inmutabilidad
  • Transparencia referencial

Otros más son parte de ES6 y están disponibles parcial o totalmente en este momento:

  • Compacto, incluso conciso, funciones
  • Recurrencia performante a través de la optimización de la cola

Y hay muchos otros que están realmente fuera del alcance normal de Javascript:

  • La coincidencia de patrones
  • Evaluación perezosa
  • Homoiconicidad

Una biblioteca, entonces, puede elegir qué tipo de características está tratando de soportar y aún razonablemente llamarse "funcional".

Especificación de tierra de fantasía

Fantasy-land es una especificación para varios tipos estándar portados desde teoría matemática de categorías y álgebra abstracta hasta programación funcional, tipos como Monoid , Functor y Monad . Estos tipos son bastante abstractos y posiblemente extiendan nociones más familiares. Los functores, por ejemplo, son contenedores que se pueden map con una función, del mismo modo que una matriz se puede map usando Array.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 Maybe , Either , Task (muy similar a lo que en otras partes se llama Futuro, y un primo más legítimo de una Promesa), y Validation

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, los cuales hacen que sea mucho más fácil programar de manera funcional.

Este ejemplo, de la documentación de Folktale , muestra cómo podría usarse:

// 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 (descargo de responsabilidad: soy uno de los autores) es un tipo de biblioteca muy diferente. No proporciona nuevos tipos para usted. 1 En cambio, proporciona funciones para facilitar el funcionamiento de los 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 algunas 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 función de map de Ramda funciona de manera similar a la del R.map(square, [1, 2, 3, 4]); //=> [1, 4, 9, 16] , por lo que R.map(square, [1, 2, 3, 4]); //=> [1, 4, 9, 16] R.map(square, [1, 2, 3, 4]); //=> [1, 4, 9, 16] . Pero como Folktale''s Maybe implementa la especificación Fantasy-land Functor , que también especifica el mapa, también puedes usar el map de Ramda:

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

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 construir una función más compleja componiendo las más pequeñas, como se ve en un artículo sobre la filosofía 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] );

Otras bibliotecas

En realidad encontré más bibliotecas, todas parecen caer en las dos categorías. subrayado, lodash son muy parecidos a Ramda. Fantasy-land, pointfree-fantasy son como cuentos populares.

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 más completa, sin duda una de las más maduras. Pointfree-fantasy y ramda-fantasy son otros, y hay muchos más .

Underscore lodash y el lodash son superficialmente como Ramda en el sentido de que son bibliotecas de bolsa, 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 en un nivel más profundo, Ramda tiene preocupaciones muy diferentes de esas bibliotecas. Los primos más cercanos de Ramda son probablemente bibliotecas como FKit , Fnuc y Wu.js

Bilby a una categoría propia, ya que proporciona una serie de herramientas como las que proporciona Ramda y 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 enfoque funcional y grado de compromiso funcional.

Algunas de estas bibliotecas realmente funcionan bien juntas. Ramda debería funcionar bien con Folktale u otras implementaciones de Fantasy-land. Como 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 un poco la molestia de la integración.

La elección de la biblioteca, o incluso el estilo de biblioteca a utilizar, dependerá de su proyecto y sus preferencias. Hay muchas buenas opciones disponibles, y los números están creciendo, y muchos de ellos están mejorando enormemente. Es un buen momento para hacer programación funcional en JS.

1 Bueno, hay un proyecto paralelo, ramda-fantasy hace algo similar a lo que hace Folktale, pero no es parte de la biblioteca principal.