Estou aprendendo javascript FP lendo o livro do DrBoolean .
Procurei por uma biblioteca de programação funcional. Encontrei Ramda e Folktale. Ambos afirmam ser uma biblioteca de programação funcional.
Mas eles são tão diferentes:
Ramda parece conter funções utilitárias para lidar com lista: mapear, reduzir, filtrar e funções puras: curry, compor. Não contém nada para lidar com mônada, functor.
Folktale, entretanto, não contém nenhum utilitário para listas ou funções. Parece implementar algumas estruturas algébricas em javascript, como monad: Maybe, Task ...
Na verdade, encontrei mais bibliotecas, todas parecem se enquadrar em duas categorias. O sublinhado e o lodash são como Ramda. A terra da fantasia, a fantasia pontual são como contos populares.
Essas bibliotecas muito diferentes podem ser chamadas de funcionais e, em caso afirmativo, o que torna cada uma delas uma biblioteca funcional?
fonte
[1,2,3].map(fnSquare).reduce(fnSum)
2. estruturas do tipo Y-combinator amplamente acadêmicas do tipo "look ma no var ". 3. usandoFunction.prototype
para modificar o comportamento de outras funções, comovar isMissingID=fnContains.partial("id").negate();
Respostas:
Características Funcionais
Não existe um limite bem definido do que define a programação funcional ou uma biblioteca funcional. Alguns recursos das linguagens funcionais são integrados ao Javascript:
Outros são possíveis de realizar em Javascript com algum cuidado:
Outros ainda fazem parte do ES6 e estão parcial ou totalmente disponíveis agora:
E há muitos outros que estão realmente além do alcance normal do Javascript:
Uma biblioteca, então, pode escolher quais tipos de recursos ela está tentando suportar e ainda ser razoavelmente chamada de "funcional".
Especificação da terra da fantasia
Fantasy-terra é uma especificação para um número de tipos padrão portados de Categoria matemática Teoria e Abstract Algebra a programação funcional, tipos, tais como Monoid , Functor e Mônada . Esses tipos são bastante abstratos e estendem noções possivelmente mais familiares. Functors, por exemplo, são containers que podem ser transmitidos
map
com uma função, da mesma forma que um array pode ser transmitidomap
usandoArray.prototype.map
.Conto popular
Folktale é uma coleção de tipos que implementam várias partes da especificação Fantasy-land e uma pequena coleção de funções utilitárias associadas. Esses tipos são coisas como Maybe , Either , Task (muito semelhante ao que em outro lugar é chamado de Futuro e um primo mais legítimo de uma promessa) e Validação
Folktale é talvez a implementação mais conhecida da especificação Fantasy-land, e é muito respeitada. Mas não existe uma implementação definitiva ou padrão; fantasy-land apenas especifica tipos abstratos, e uma implementação, é claro, deve criar tais tipos concretos. A afirmação da Folktale de ser uma biblioteca funcional é clara: ela fornece tipos de dados encontrados normalmente em linguagens de programação funcionais, os que o tornam substancialmente mais fácil de programar de maneira funcional.
Este exemplo, da documentação do Folktale ( observação : não nas versões recentes dos documentos), mostra como ele pode ser usado:
Ramda
Ramda (isenção de responsabilidade: eu sou um dos autores) é um tipo de biblioteca muito diferente. Não fornece novos tipos para você. 1 Em vez disso, ele fornece funções para facilitar a operação em tipos existentes. É construído em torno das noções de compor funções menores em funções maiores, de trabalhar com dados imutáveis, de evitar efeitos colaterais.
Ramda opera especialmente em listas, mas também em objetos e, às vezes, em Strings. Ele também delega muitas de suas chamadas de tal maneira que irá interoperar com Folktale ou outras implementações de Fantasy-land. Por exemplo, a
map
função de Ramda opera de forma semelhante àquela deArray.prototype
, portantoR.map(square, [1, 2, 3, 4]); //=> [1, 4, 9, 16]
. Mas como o FolktaleMaybe
implementa aFunctor
especificação Fantasy-land , que também especifica o mapa, você também pode usar Ramdamap
com ele:A afirmação de Ramda de ser uma biblioteca funcional consiste em facilitar a composição de funções, nunca alterando seus dados e apresentando apenas funções puras. O uso típico de Ramda seria construir funções mais complexas, compondo outras menores, como visto em um artigo sobre a filosofia de Ramda
Outras Bibliotecas
Isso não é muito preciso. Em primeiro lugar, Fantasy-land é simplesmente uma especificação que as bibliotecas podem decidir implementar para vários tipos. Folktale é uma das muitas implementações dessa especificação, provavelmente a mais completa, certamente uma das mais maduras. A fantasia sem pontos e a fantasia ramda são outras, e existem muitas mais .
O sublinhado e o lodash são superficialmente como Ramda no sentido de que são bibliotecas improvisadas, fornecendo um grande número de funções com muito menos coesão do que algo como Folktale. E mesmo a funcionalidade específica muitas vezes se sobrepõe à de Ramda. Mas em um nível mais profundo, Ramda tem preocupações muito diferentes dessas bibliotecas. Primos mais próximos de Ramda são provavelmente bibliotecas como FKit , Fnuc e Wu.js .
Bilby está em uma categoria própria, fornecendo várias ferramentas, como as fornecidas por Ramda, e alguns tipos consistentes com Fantasy-land. (O autor de Bilby é o autor original de Fantasy-land também.)
Sua chamada
Todas essas bibliotecas têm o direito de ser chamadas de funcionais, embora variem muito na abordagem funcional e no grau de comprometimento funcional.
Algumas dessas bibliotecas funcionam bem juntas. Ramda deve funcionar bem com Folktale ou outras implementações de Fantasy-land. Como suas preocupações quase não se sobrepõem, eles realmente não entram em conflito, mas Ramda faz apenas o suficiente para tornar a interoperação relativamente tranquila. Isso provavelmente é menos verdadeiro para algumas das outras combinações que você pode escolher, mas a sintaxe de função mais simples do ES6 também pode aliviar um pouco a dor da integração.
A escolha da biblioteca, ou mesmo o estilo de biblioteca a ser usado, vai depender do seu projeto e das suas preferências. Existem muitas boas opções disponíveis, e os números estão crescendo, e muitas delas estão melhorando muito. É um bom momento para fazer programação funcional em JS.
1 Bem, há um projeto paralelo, fantasia ramda fazendo algo semelhante ao que o Folktale faz, mas não faz parte da biblioteca central.
fonte
yield
Torna mais fácil fazer o tipo de processamento de lista preguiçoso feito porLazy
oulz.js
. Mas isso não ajuda com a preguiça de nível de linguagem.someFunc(a + b)
em JS primeiro adiciona os valores dea
eb
então fornece esse resultado como o parâmetro para someFunc. O equivalente em Haskell não faz isso. Se a função chamada nunca usar esse valor, ela nunca realizará a adição. Se eventualmente usá-lo, é considerado uma expressão a ser calculada até que seu resultado seja necessário. Se você nunca fizer nada que o force (como IO), ele nunca executará o cálculo.