SlideShare uma empresa Scribd logo
1 de 42
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

Mais conteúdo relacionado

Mais procurados (20)

Estrutura de dados - Pilhas
Estrutura de dados - PilhasEstrutura de dados - Pilhas
Estrutura de dados - Pilhas
 
Python Funcional
Python FuncionalPython Funcional
Python Funcional
 
Haskell
HaskellHaskell
Haskell
 
Estrutura de dados - Filas
Estrutura de dados - FilasEstrutura de dados - Filas
Estrutura de dados - Filas
 
Estrutura de dados em Java - Filas com lista encadeada
Estrutura de dados em Java - Filas com lista encadeada Estrutura de dados em Java - Filas com lista encadeada
Estrutura de dados em Java - Filas com lista encadeada
 
Listas em C
Listas em CListas em C
Listas em C
 
Introdução ao paradigma funcional com scala
Introdução ao paradigma funcional com scalaIntrodução ao paradigma funcional com scala
Introdução ao paradigma funcional com scala
 
Estrutura de dados em Java - Pilhas
Estrutura de dados em Java - PilhasEstrutura de dados em Java - Pilhas
Estrutura de dados em Java - Pilhas
 
Pilha e Fila Estática
Pilha e Fila EstáticaPilha e Fila Estática
Pilha e Fila Estática
 
Pilhas e Filas
Pilhas e FilasPilhas e Filas
Pilhas e Filas
 
Pilha e filas
Pilha e filasPilha e filas
Pilha e filas
 
Estrutura de Dados - Aula 04
Estrutura de Dados - Aula 04Estrutura de Dados - Aula 04
Estrutura de Dados - Aula 04
 
Apresentação recursividade rev2
Apresentação recursividade rev2Apresentação recursividade rev2
Apresentação recursividade rev2
 
Estrutura de Dados - Aula 08
Estrutura de Dados - Aula 08Estrutura de Dados - Aula 08
Estrutura de Dados - Aula 08
 
Recursividade
RecursividadeRecursividade
Recursividade
 
Tutorial aed iii 008 - algoritmo de ordenação heapsort
Tutorial aed iii   008 - algoritmo de ordenação heapsortTutorial aed iii   008 - algoritmo de ordenação heapsort
Tutorial aed iii 008 - algoritmo de ordenação heapsort
 
Ling c
Ling cLing c
Ling c
 
Vetores, Matrizes e Strings em C Parte 3
Vetores, Matrizes e Strings em C Parte 3Vetores, Matrizes e Strings em C Parte 3
Vetores, Matrizes e Strings em C Parte 3
 
Aula02 Pilhas
Aula02   PilhasAula02   Pilhas
Aula02 Pilhas
 
Apostila rpira
Apostila rpiraApostila rpira
Apostila rpira
 

Semelhante a Programação funcional no dia a dia

Escrevendo modulos python com rust
Escrevendo modulos python com rustEscrevendo modulos python com rust
Escrevendo modulos python com rustBruno Rocha
 
Algoritmos e Estrutura de Dados - Aula 04
Algoritmos e Estrutura de Dados - Aula 04Algoritmos e Estrutura de Dados - Aula 04
Algoritmos e Estrutura de Dados - Aula 04thomasdacosta
 
Stored Procedures com PostgreSQL: porque usar.
Stored Procedures com PostgreSQL:  porque usar.Stored Procedures com PostgreSQL:  porque usar.
Stored Procedures com PostgreSQL: porque usar.Atmos Maciel
 
JavaScript - De verdade
JavaScript - De verdadeJavaScript - De verdade
JavaScript - De verdadeLuis Vendrame
 
Linguagens de Script: Caso de Estudo Lua
Linguagens de Script: Caso de Estudo LuaLinguagens de Script: Caso de Estudo Lua
Linguagens de Script: Caso de Estudo LuaSérgio Souza Costa
 
Programação functional reativa: lidando com código assíncrono
Programação functional reativa: lidando com código assíncronoProgramação functional reativa: lidando com código assíncrono
Programação functional reativa: lidando com código assíncronoLeonardo Borges
 
TDC2018SP | Trilha Ruby - Programacao funcional com Ruby, potencialize e simp...
TDC2018SP | Trilha Ruby - Programacao funcional com Ruby, potencialize e simp...TDC2018SP | Trilha Ruby - Programacao funcional com Ruby, potencialize e simp...
TDC2018SP | Trilha Ruby - Programacao funcional com Ruby, potencialize e simp...tdc-globalcode
 
Lógica de programação pascal
Lógica de programação   pascalLógica de programação   pascal
Lógica de programação pascalJocelma Rios
 
Removendo o cheiro ruim do seu código - PHPSC Conf 2011
Removendo o cheiro ruim do seu código - PHPSC Conf 2011Removendo o cheiro ruim do seu código - PHPSC Conf 2011
Removendo o cheiro ruim do seu código - PHPSC Conf 2011Luís Cobucci
 
Light Talk sobre JavaScript Funcional
Light Talk sobre JavaScript FuncionalLight Talk sobre JavaScript Funcional
Light Talk sobre JavaScript FuncionalEmanuel Gonçalves
 
O que é que o Java não tem?
O que é que o Java não tem?O que é que o Java não tem?
O que é que o Java não tem?Denis Costa
 
Introdução ao paradigma imperativo
Introdução ao paradigma imperativoIntrodução ao paradigma imperativo
Introdução ao paradigma imperativoTony Alexander Hild
 
Ruby e Erlang de mãos dadas
Ruby e Erlang de mãos dadasRuby e Erlang de mãos dadas
Ruby e Erlang de mãos dadasÉverton Ribeiro
 

Semelhante a Programação funcional no dia a dia (20)

Escrevendo modulos python com rust
Escrevendo modulos python com rustEscrevendo modulos python com rust
Escrevendo modulos python com rust
 
Algoritmos e Estrutura de Dados - Aula 04
Algoritmos e Estrutura de Dados - Aula 04Algoritmos e Estrutura de Dados - Aula 04
Algoritmos e Estrutura de Dados - Aula 04
 
Stored Procedures com PostgreSQL: porque usar.
Stored Procedures com PostgreSQL:  porque usar.Stored Procedures com PostgreSQL:  porque usar.
Stored Procedures com PostgreSQL: porque usar.
 
JavaScript - De verdade
JavaScript - De verdadeJavaScript - De verdade
JavaScript - De verdade
 
Linguagens de Script: Caso de Estudo Lua
Linguagens de Script: Caso de Estudo LuaLinguagens de Script: Caso de Estudo Lua
Linguagens de Script: Caso de Estudo Lua
 
Programação functional reativa: lidando com código assíncrono
Programação functional reativa: lidando com código assíncronoProgramação functional reativa: lidando com código assíncrono
Programação functional reativa: lidando com código assíncrono
 
TDC2018SP | Trilha Ruby - Programacao funcional com Ruby, potencialize e simp...
TDC2018SP | Trilha Ruby - Programacao funcional com Ruby, potencialize e simp...TDC2018SP | Trilha Ruby - Programacao funcional com Ruby, potencialize e simp...
TDC2018SP | Trilha Ruby - Programacao funcional com Ruby, potencialize e simp...
 
Lógica de programação pascal
Lógica de programação   pascalLógica de programação   pascal
Lógica de programação pascal
 
JavaScript - A Linguagem
JavaScript - A LinguagemJavaScript - A Linguagem
JavaScript - A Linguagem
 
P funcional
P funcionalP funcional
P funcional
 
Removendo o cheiro ruim do seu código - PHPSC Conf 2011
Removendo o cheiro ruim do seu código - PHPSC Conf 2011Removendo o cheiro ruim do seu código - PHPSC Conf 2011
Removendo o cheiro ruim do seu código - PHPSC Conf 2011
 
Functional Programming - Scala
Functional Programming - ScalaFunctional Programming - Scala
Functional Programming - Scala
 
PHP 5.3 - Funções
PHP 5.3 - FunçõesPHP 5.3 - Funções
PHP 5.3 - Funções
 
Light Talk sobre JavaScript Funcional
Light Talk sobre JavaScript FuncionalLight Talk sobre JavaScript Funcional
Light Talk sobre JavaScript Funcional
 
Algoritmo recursivo
Algoritmo recursivoAlgoritmo recursivo
Algoritmo recursivo
 
Linguagem Python
Linguagem PythonLinguagem Python
Linguagem Python
 
O que é que o Java não tem?
O que é que o Java não tem?O que é que o Java não tem?
O que é que o Java não tem?
 
Pythonfuncional
PythonfuncionalPythonfuncional
Pythonfuncional
 
Introdução ao paradigma imperativo
Introdução ao paradigma imperativoIntrodução ao paradigma imperativo
Introdução ao paradigma imperativo
 
Ruby e Erlang de mãos dadas
Ruby e Erlang de mãos dadasRuby e Erlang de mãos dadas
Ruby e Erlang de mãos dadas
 

Programação funcional no dia a dia