programação funcional no dia a dia

Post on 13-Apr-2017

417 Views

Category:

Technology

0 Downloads

Preview:

Click to see full reader

TRANSCRIPT

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

top related