Paradigmas de Programação
Ronaldo F. Ramos
Instituto Federal do Ceará
29 de outubro de 2023
PARTE 3 - PARADIGMA FUNCIONAL
PROGRAMAÇÃO FUNCIONAL EM JAVASCRIPT
AULA 1/1
Ronaldo F. Ramos Instituto Federal do Ceará
Paradigmas de Programação
Roteiro
• Programação Funcional em JavaScript
Ronaldo F. Ramos Instituto Federal do Ceará
Paradigmas de Programação
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
Foco da Programação Funcional
• Manutenibilidade
• Testabilidade
Ronaldo F. Ramos Instituto Federal do Ceará
Paradigmas de Programação
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
E N J O Y
Ronaldo F. Ramos Instituto Federal do Ceará
Paradigmas de Programação

javascript_funcional.pdf

  • 1.
    Paradigmas de Programação RonaldoF. Ramos Instituto Federal do Ceará 29 de outubro de 2023
  • 2.
    PARTE 3 -PARADIGMA FUNCIONAL PROGRAMAÇÃO FUNCIONAL EM JAVASCRIPT AULA 1/1 Ronaldo F. Ramos Instituto Federal do Ceará Paradigmas de Programação
  • 3.
    Roteiro • Programação Funcionalem JavaScript Ronaldo F. Ramos Instituto Federal do Ceará Paradigmas de Programação
  • 4.
    Definição Em ciência dacomputaçã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çãoFuncional • Manutenibilidade • Testabilidade Ronaldo F. Ramos Instituto Federal do Ceará Paradigmas de Programação
  • 6.
    Um Programa SimplesNã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 AltaOrdem 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 emJavascript 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 ouso 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 efeitoscolaterais, por não serem isolados, dificultam o processo de testes. Ronaldo F. Ramos Instituto Federal do Ceará Paradigmas de Programação
  • 14.
    Exemplos de EfeitosColaterais • 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 parafunçõ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 // exemplode 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 palavrareservada 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 1let 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 deconjutos 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 Javascripttambé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 Exemplode 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 usodo 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 doCá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 deCurry 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 Chamadascom 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 possuibibliotecas 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 vimosos 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 JO Y Ronaldo F. Ramos Instituto Federal do Ceará Paradigmas de Programação