O documento discute a programação funcional em JavaScript. Ele define programação funcional, foca em aspectos como manutenibilidade e testabilidade, e apresenta exemplos de funções puras, imutabilidade, mapas, filtros, reduce, currying e encadeamento de chamadas usando pipe/compose. O documento também menciona bibliotecas funcionais como Ramda e sugere estudar linguagens puramente funcionais após entender os conceitos básicos em JavaScript.
4. Definição
Em ciência da computação, programação funcional é um paradigma de programação
que trata a computação como uma avaliação de funções matemáticas e que evita
estados ou dados mutáveis. Ela enfatiza a aplicação de funções, em contraste da
programação imperativa, que enfatiza mudanças no estado do programa 1 2
1
Fonte: Wikipedia
2
Paul Hudak (setembro de 1989). "Conception, evolution, and application of functional
programming languages"(pdf) . ACM Computing Surveys.
Ronaldo F. Ramos Instituto Federal do Ceará
Paradigmas de Programação
5. Foco da Programação Funcional
• Manutenibilidade
• Testabilidade
Ronaldo F. Ramos Instituto Federal do Ceará
Paradigmas de Programação
6. Um Programa Simples Não Funcional em Javascript
1 // definindo uma função
2 function saudacao_simples (nome,saudacao){
3 return saudacao+’ ’+nome;
4 }
5 console.log( saudacao_simples (’Pedro ’,’Ola Mói de Chifres ’));
Saída:
node .saudacao_simples.js
Ola Mói de Chifres Pedro
Ronaldo F. Ramos Instituto Federal do Ceará
Paradigmas de Programação
7. Funções de Alta Ordem
Diz-se que Javascript trata funções como cidadãos de primeira classe. A seguir criamos
uma variável (constante e imutável) que é uma função e que retorna outra função.
1 const saudacao = function(saudacao){
2 return function(nome){
3 return saudacao+’ ’+nome;
4 }
5 }
6 // permitindo a especialização das funções
7 const saudacao_cearence = saudacao("Fala mói de chifres");
8 const saudacao_paulista = saudacao("Urra meu..")
9 const saudacao_carioca = saudacao(’Papo reto mano ’)
10 console.log( saudacao_cearence (’Pedro ’));
11 console.log( saudacao_paulista (’Pedro ’));
12 console.log( saudacao_carioca (’Pedro ’));
Ronaldo F. Ramos Instituto Federal do Ceará
Paradigmas de Programação
8. Saídas
1 node .primeira_classe .js
2 Fala mói de chifres Pedro
3 Urra meu.. Pedro
4 Papo reto mano Pedro
Ronaldo F. Ramos Instituto Federal do Ceará
Paradigmas de Programação
9. Loops Funcionais em Javascript
Vejamos um exemplo de Loops em sintaxe funcional em JS
1 // exemplos de loops
2 const numeros = [1,2,3,4,5]
3
4 // este é um exemplo de loop imperativo
5 for(i=0;i<numeros.length;i++){
6 console.log(numeros[i])
7 }
8
9 // o mesmo loop no formato declarativo funcional
10 numeros.forEach(function(i){
11 console.log(i);
12 })
Ronaldo F. Ramos Instituto Federal do Ceará
Paradigmas de Programação
10. Simplificando com o uso de funções de seta
1 const numeros = [1,2,3,4,5]
2
3 const saida = i => console.log(i);
4
5 numeros.forEach(saida);
Ronaldo F. Ramos Instituto Federal do Ceará
Paradigmas de Programação
11. Funções de Seta
A "arrow function"é uma forma mais concisa de escrever funções anônimas em
JavaScript, e ela é denotada pelo uso do operador =>. Ela é frequentemente utilizada
para criar funções de callback ou funções anônimas em situações em que a brevidade
do código é desejada.
Ronaldo F. Ramos Instituto Federal do Ceará
Paradigmas de Programação
12. Efeitos Colaterais - Side Effects
Problemas do ponto de vista da programação funcional(efeitos colaterais)
• A função construtora modifica variáveis fora do seu escopo
• As funções internas (não main) executam operações de entrada e saída
A existência de efeitos colaterais nos programas dificulta a compreensibilidade do
programa e sua manutenibilidade. Além disso o fato das variáveis serem mutáveis
também contribui para dificultar a rastreabilidade do mesmo.
Ronaldo F. Ramos Instituto Federal do Ceará
Paradigmas de Programação
13. Testabilidade
Procedimentos com efeitos colaterais, por não serem isolados, dificultam o processo de
testes.
Ronaldo F. Ramos Instituto Federal do Ceará
Paradigmas de Programação
14. Exemplos de Efeitos Colaterais
• Imprimir alguma coisa
• Ler um arquivo
• Escrever em um arquivo
• Interagir com uma base de dados
Ronaldo F. Ramos Instituto Federal do Ceará
Paradigmas de Programação
15. Funções Puras
Regras para funções puras:
• Trabalha somente com dados que são passados para a mesma.
• Retorna sempre os mesmos resultados para as mesmas entradas.
• Não tem efeitos colaterais.
Ronaldo F. Ramos Instituto Federal do Ceará
Paradigmas de Programação
16. Exemplos
1 // exemplo de função pura
2 function addiciona(x,y){
3 return x + y;
4 }
5 // a mesma função impura
6 function addiciona(x,y){
7 console.log(x+y); // uso de efeito colateral torna a função
impura
8 return x + y;
9 }
Ronaldo F. Ramos Instituto Federal do Ceará
Paradigmas de Programação
17. Objetos Imutáveis
A palavra reservada const torna variáveis e referências e mutáveis, mas não impede
que os atributos dos objetos mudem. Para isso pode-se usar os ’frozen objects’.
Ronaldo F. Ramos Instituto Federal do Ceará
Paradigmas de Programação
18. Exemplos de Imutabilidade
1 let x = 2; // mutável
2 const y = 2; // imutavel
3 x = 10;
4
5 y = 3; // TypeError: Assignment to constant variable.
6
7 const pessoa = {
8 nome:’jose ’,
9 profissao:’professor ’
10 }
11
12 pessoa = null; // TypeError: Assignment to constant variable.
13
14 pessoa.nome = ’Barteu ’; // sem problemas aqui
Ronaldo F. Ramos Instituto Federal do Ceará
Paradigmas de Programação
19. Objeto Congelado
Uso de conjutos fixos (frozen)
1 const indices = Object.freeze ([0,1,2,3,4,5,6,7,8,9,]); // objeto
imutável
2
3 // criando outro objeto a partir do anterior (frozen)
4
5 function adicionaElemento (lista){
6 return Object.freeze ([...lista, lista.length ]);
7 }
8 console.log( adicionaElemento ( adicionaElemento (indices)));
Ronaldo F. Ramos Instituto Federal do Ceará
Paradigmas de Programação
20. Mapas em Javascript
Javascript também possui a função Map com funcionalidade idêntica
1 const numeros = [1, 2, 3, 4, 5];
2 const duplicados = numeros.map(function(numero) {
3 return numero * 2;
4 });
5 console.log(duplicados); // [2, 4, 6, 8, 10]
Ronaldo F. Ramos Instituto Federal do Ceará
Paradigmas de Programação
21. Filtros em Javascript
Exemplo de uso do filter em javascript
1 const nomes = ["Ana", "Bruno", "Carlos", "Alice", "Daniel"];
2 const nomesComA = nomes.filter(function(nome) {
3 return nome [0] === "A";
4 });
5 console.log(nomesComA); // ["Ana", "Alice "]
Ronaldo F. Ramos Instituto Federal do Ceará
Paradigmas de Programação
22. Reduce
Exemplo de uso do Reduce em Javascript
1 const frase = "O rato roeu a roupa do rei de Roma";
2 const palavras = frase.split(" "); // ["O", "rato",..., "Roma"]
3 const frequencia = palavras.reduce ((obj, palavra) => {
4 // se palavra já existe incrementa o contador senão cria a chave
5 if (obj[palavra ]) {
6 obj[palavra ]++;
7 } else {
8 obj[palavra] = 1;
9 }
10 return obj;
11 }, {}); // inicia o objeto vazio
12 console.log(frequencia); // { O: 1, rato: 1, roeu: 1, a: 1, roupa: 1,
do: 1, rei: 1, de: 1, Roma: 1 }
Ronaldo F. Ramos Instituto Federal do Ceará
Paradigmas de Programação
23. Currying
Conceito advindo do Cálculo Lambda nomeado em homenagem a Haskell Curry.
Vejamos a composição abaixo.
1 const fazerBolo = (ingredientes1) =>{
2 return (ingredientes2) => {
3 return (ingredientes3) => {
4 return ingredientes1 +’ ’ + ingredientes2 +’ ’ +
ingredientes3
5 }
6 }
7 }
8 /* o que temos acima é uma função fazerbolo que retorna uma
função anônima que também retorna uma função anônima ou seja
temos 3 funções com 3 argumentos diferentes */
9 const meuBolo = fazerBolo(’ovos ’)(’farinha ’)(’manteiga ’);
10 console.log(meuBolo);
Ronaldo F. Ramos Instituto Federal do Ceará
Paradigmas de Programação
24. Currying - Cont
1 /* encadeando os parãmetros das funções ficamos assim */
2 const fbolo = (ingr1)=>(ingr2)=>(ingr3)=>ingr1+’ ’+ingr2+’ ’+ingr3;
3 const meubolo = fbolo(’ovos ’)(’farinha ’)(’manteiga ’);
4 console.log(meubolo);
Observe o que acontece com os returns dentro das funções. As funções mais internas
retornam uma formatação de função para as mais externas até que elas se fundem em
uma só função que retorna para o primeiro chamador.
Ronaldo F. Ramos Instituto Federal do Ceará
Paradigmas de Programação
25. Outro exemplo de Curry
1 /* mais uma explicacao par o curry */
2 const mutiplica = (x,y) => x * y;
3 console.log(mutiplica (2,3));
4
5 const multiplicacurry = y => x=> x * y;
6 console.log( multiplicacurry (2));
7 console.log( multiplicacurry (2) (3));
Saída:
1 6
2 [ Function (anonymous) ]
3 6
Ronaldo F. Ramos Instituto Federal do Ceará
Paradigmas de Programação
26. Encadeamento de Chamadas com Pipe/Compose
Exemplo de uso do pipe e compose para processar nome em sequência
1 getNome = (pessoa) => pessoa.nome; // retorna o nome
2 maiusculas = (string) => string.toUpperCase (); // retorna maiúsculas
3 getPrenome = (string) => string.substring (0, 4); // pega o inicio
4 console.log(’1: ’+getPrenome(maiusculas(getNome ({ nome: ’Dino da
Silva Sauro ’ }))));
5 // um jeito mais limpo de fazer isso ????
6 const pipe = (...fns) => (x) => fns.reduce ((v, f) => f(v), x);
7 const compose = (...fns) => x => fns.reduceRight ((v, f) => f(v), x);
8 console.log(’2: ’+pipe(getNome,maiusculas,getPrenome)({ nome: ’Dino
da Silva Sauro ’ }));
9 console.log(’3: ’+compose(getPrenome,maiusculas,getNome)({ nome:
’Dino da Silva Sauro ’ }));
Ronaldo F. Ramos Instituto Federal do Ceará
Paradigmas de Programação
27. Bibliotecas Funcionais
Javascript possui bibliotecas funcionais para ajudar a trabalhar de forma mais ajustada
a este paradigma.
Ver RAMDA
https://ramdajs.com/
Ronaldo F. Ramos Instituto Federal do Ceará
Paradigmas de Programação
28. Seguindo
Agora que vimos os conceitos básicos associados a programação funcional podemos
estudar linguagens puramente funcional.
Ronaldo F. Ramos Instituto Federal do Ceará
Paradigmas de Programação
29. E N J O Y
Ronaldo F. Ramos Instituto Federal do Ceará
Paradigmas de Programação