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-ordem
function 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)); // 3
console.log(calcula(multiplica, 1, 2)); // 2
Função de alta-ordem
function 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-ordem
function adiciona(a) {
return function(b) {
return a + b;
};
}
var adiciona5 = adiciona(5);
console.log(adiciona5(1)); // 6
console.log(adiciona(3)(10)); // 13
Recursividade ?
Recursividade
function 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 cauda
function 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.
Imutabilidade
var 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); // []
Imutabilidade
var 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 pura
var 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

Programação funcional no dia a dia