Post on 13-Apr-2017
Programação Funcional
ƛHercules Lemke Merscher
“A language that doesn't affect the way you think about programming, is not worth knowing.” (Alan Perlis)
Programação imperativa
O diabo mora na variável global
Muitas variáveis globais
Muitas variáveis globais
Oi?
Programação funcional?
O que é?
● Um paradigma de programação;
● Com origem no cálculo lambda;
● Trata computações como avaliação de funções, ao invés de execução de procedimentos.
Populares
Conceitos principais● Funções de alta-ordem (high-order functions);
● Funções puras (pure functions);
● Transparência referencial (referential transparency);
● Recursividade (recursion) / Recursividade em cauda (tail recursion);
Conceitos principais● Dados separados dos comportamentos;
● Funções que se compõe para manipular os dados;
● Imutabilidade por padrão;
● Limita efeitos colaterais.
Podemos usar conceitos da programação funcional no dia a dia, mesmo em
linguagens não funcionais.
Função de alta-ordem ?
f(x)
Função de alta-ordemfunction soma(a, b) { return a + b;}function multiplica(a, b) { return a * b;}function calcula(operacao, a, b) { return operacao(a, b);}console.log(calcula(soma, 1, 2)); // 3console.log(calcula(multiplica, 1, 2)); // 2
Função de alta-ordemfunction exibeUsuario(usuario) { console.log(usuario.nome + ‘ - ’ usuario.email);}
function buscaUsuario() { $.get(‘http://dev-es.com.br/usuarios/1’, exibeUsuario);}
buscaUsuario();// Fulano de Tal - fulano.de.tal@dev-es.com.br
Função de alta-ordemfunction adiciona(a) { return function(b) { return a + b; };}
var adiciona5 = adiciona(5);
console.log(adiciona5(1)); // 6console.log(adiciona(3)(10)); // 13
Recursividade ?
Recursividadefunction somaInteiros(lista) { if (lista.length === 0) { return 0; } var ultimo = lista.pop(); return ultimo + somaInteiros(lista);}
console.log(somaInteiros([1,2,3,4,5])); // 15
Recursividade em caudafunction somaInteiros(lista) { (function somaInteirosInterno(inteiros, soma) { if (inteiros.length === 0) { return soma; } var ultimo = inteiros.pop(); var novaSoma = soma + ultimo; return somaInteirosInterno(inteiros, novaSoma); })(lista, 0); }
console.log(somaInteiros([1,2,3,4,5])); // 15
CUIDADO!!!Nem todo
compilador/interpretador é otimizado para utilizar
recursividade.
Imutabilidade
“Premature optimization is the root of all evil.” (Donald Knuth)
Imutabilidade
Mutable state is the root of almost all evil.
Imutabilidadevar inteiros = [1,2,3,4,5,6,7,8,9,10];
var inteirosMenores = inteiros.splice(0, 5);
var inteirosMaiores = inteiros.splice(5, 10);
console.log(inteiros); // [6,7,8,9,10]console.log(inteirosMenores); // [1,2,3,4,5]console.log(inteirosMaiores); // []
Imutabilidadevar inteiros = [1,2,3,4,5,6,7,8,9,10];
var inteirosMenores = inteiros.slice(0, 5);
var inteirosMaiores = inteiros.slice(5, 10);
console.log(inteiros); // [1,2,3,4,5,6,7,8,9,10]console.log(inteirosMenores); // [1,2,3,4,5]console.log(inteirosMaiores); // [6,7,8,9,10]
splice vs slice
splice é uma função impura
var inteiros = [1,2,3,4,5,6,7,8,9,10];
inteiros.splice(0, 5); // [1,2,3,4,5]console.log(inteiros); // [6,7,8,9,10]
inteiros.splice(0, 5); // [6,7,8,9,10]console.log(inteiros); // []
slice é uma função puravar inteiros = [1,2,3,4,5,6,7,8,9,10];
inteiros.slice(0, 5); // [1,2,3,4,5]console.log(inteiros); // [1,2,3,4,5,6,7,8,9,10]
inteiros.slice(0, 5); // [1,2,3,4,5]console.log(inteiros); // [1,2,3,4,5,6,7,8,9,10]
inteiros.slice(0, 3); // [1,2,3]console.log(inteiros); // [1,2,3,4,5,6,7,8,9,10]
Imutabilidade e funções puras nos levam a
transparência referencial.
O que mais?
Paralelismo
Concorrência
“Sometimes, the elegant implementation is just a function. Not a method. Not a class. Not a framework. Just a function.” (John Carmack)
Aprofundando
Aprofundando
● http://www.artima.com/pins1ed/● http://learnyouahaskell.com/● http://www.braveclojure.com/● https://drboolean.gitbooks.io/mostly-adequate-guide● https://en.wikipedia.org/wiki/Functional_programming● https://www.cs.kent.ac.uk/people/staff/dat/miranda/
whyfp90.pdf
MOOC
● https://www.edx.org/course/introduction-functional-programming-delftx-fp101x-0
● https://www.coursera.org/course/progfun● https://www.coursera.org/course/proglang
Perguntas?
Obrigado!herculesdev.com.br