Programação Funcional: Novos Horizontes para a Expansão da Consciência

41
Programação Funcional: Novos Horizontes para a Expansão da Consciência Andrei de Araújo Formiga @andreiformiga

Transcript of Programação Funcional: Novos Horizontes para a Expansão da Consciência

Page 1: Programação Funcional: Novos Horizontes para a Expansão da Consciência

Programação Funcional: Novos Horizontes para a

Expansão da Consciência

Andrei de Araújo Formiga@andreiformiga

Page 2: Programação Funcional: Novos Horizontes para a Expansão da Consciência
Page 3: Programação Funcional: Novos Horizontes para a Expansão da Consciência
Page 4: Programação Funcional: Novos Horizontes para a Expansão da Consciência

Escolas de Magia

Abjuration

Transmutation

Conjuration

Divination

Enchantment

Evocation

Illusion

Necromancy

Page 5: Programação Funcional: Novos Horizontes para a Expansão da Consciência

Por que?

Novos pontos de vista

Novas formas de fazer magia

Page 6: Programação Funcional: Novos Horizontes para a Expansão da Consciência
Page 7: Programação Funcional: Novos Horizontes para a Expansão da Consciência

Escolas de Programação

Programação ImperativaMáquinas de Turing

Page 8: Programação Funcional: Novos Horizontes para a Expansão da Consciência

Escolas de Programação

Programação FuncionalLambda-cálculoSistemas de reescrita

Page 9: Programação Funcional: Novos Horizontes para a Expansão da Consciência

Programação Imperativa

Efeitos colaterais são vitais

Computação = alterações no estado da memória

Page 10: Programação Funcional: Novos Horizontes para a Expansão da Consciência

Efeitos = Problemas

Variáveis globais“Global variables are evil”

AliasingMais de uma referência para o mesmo

objeto Problemático se o objeto é mutável

Page 11: Programação Funcional: Novos Horizontes para a Expansão da Consciência

Efeitos = Dificuldades

Otimizações

Análises estáticas SegurançaCorretude

Compartilhamento e Concorrência

Page 12: Programação Funcional: Novos Horizontes para a Expansão da Consciência

Sem Efeitos?

O mundo muda por causa dos efeitos?

Page 13: Programação Funcional: Novos Horizontes para a Expansão da Consciência

Solução: Controlar Efeitos

OO: Encapsulamento

Passagem de MensagensEstado local não compartilhado

Page 14: Programação Funcional: Novos Horizontes para a Expansão da Consciência

Programação Funcional

Funções como conceito básicoCidadãos de 1a classe

Efeitos colaterais controladosDiferentes níveis de controle

Page 15: Programação Funcional: Novos Horizontes para a Expansão da Consciência

Características

Funções de alta ordem

Inferência de tipos

Pattern matching

Tipos de Dados Algébricos

Page 16: Programação Funcional: Novos Horizontes para a Expansão da Consciência

Características

Polimorfismo (genéricos)

Avaliação preguiçosa (lazy)

Continuações

Mônadas e Sistemas de Efeitos

Page 17: Programação Funcional: Novos Horizontes para a Expansão da Consciência

Pesquisa e Inovação

Tradição de Pesquisa em linguagens funcionais

Muitas inovações surgiram 1o nas linguagens funcionais

Fama de paradigma “acadêmico”

Page 18: Programação Funcional: Novos Horizontes para a Expansão da Consciência

Tipos fantasmas, mônadas, catamorfismos, anamorfismos, GADTs…

Page 19: Programação Funcional: Novos Horizontes para a Expansão da Consciência
Page 20: Programação Funcional: Novos Horizontes para a Expansão da Consciência

Linguagens

Scheme

Standard ML / OCaml / F#

Haskell

Scala

Erlang

Clojure

Page 21: Programação Funcional: Novos Horizontes para a Expansão da Consciência

Será JavaScript uma Linguagem Funcional?

Page 22: Programação Funcional: Novos Horizontes para a Expansão da Consciência

“JavaScript is the first lambda language to go mainstream”

JavaScript: The Good Parts, Douglas Crockford

Page 23: Programação Funcional: Novos Horizontes para a Expansão da Consciência

Funções de Alta Ordem

Funções que usam funções

Funções de 1a classe

JavaScript tem isso

Page 24: Programação Funcional: Novos Horizontes para a Expansão da Consciência

Funções em JS

Funções anônimas e closures

Callbacks e Eventos

HOFs tradicionais

Page 25: Programação Funcional: Novos Horizontes para a Expansão da Consciência

Funções em JS

function filter(pred, a) { var res = []; for (i in a) { if (pred(a[i])) res.push(a[i]); } return res;}

filter(function (x) { return x > 5 }, [4, 5, 10, 8, 12, 2, 1, 9])> [10, 8, 12, 9]

Page 26: Programação Funcional: Novos Horizontes para a Expansão da Consciência

Funções em JS

function reduce(f, a, i){ var res = i; for (i in a) res = f(res, a[i]); return res;}

reduce(function (s, x) { return s + x }, [4, 5, 10, 8, 12, 2, 1, 9], 0)> 51

Page 27: Programação Funcional: Novos Horizontes para a Expansão da Consciência

Disponível em um JavaScript próximo de você

var a = [4, 5, 10, 8, 12, 2, 1, 9];

a.filter(function (x) { return x > 5 })> [10, 8, 12, 9]

a.reduce(function (s, x) { return s+x })> 51

Page 28: Programação Funcional: Novos Horizontes para a Expansão da Consciência

Anamorfismo = reduce

Page 29: Programação Funcional: Novos Horizontes para a Expansão da Consciência

Mônadas

Um construtor + 2 funções/métodosreturnbind

Monad laws

Page 30: Programação Funcional: Novos Horizontes para a Expansão da Consciência

Mônadas são Padrões

Coleções

Quebrar + processar + retornar

Page 31: Programação Funcional: Novos Horizontes para a Expansão da Consciência

Mônadas em JS

function Cookie(val) { // armazena dado em um cookie}

var v1 = cookie1.get()var v2 = morfar(v1)var cookie2 = new Cookie(v2)

Page 32: Programação Funcional: Novos Horizontes para a Expansão da Consciência

Mônadas em JSfunction Cookie(val) { // armazena dado em um cookie}

Cookie.prototype.ret = function (v) { return new Cookie(v);}

Cookie.prototype.bind = function(f) { return new Cookie( f(this.get()) );}

Page 33: Programação Funcional: Novos Horizontes para a Expansão da Consciência

Mônadas em JS

var cookie2 = cookie1.bind(morfar)

Page 34: Programação Funcional: Novos Horizontes para a Expansão da Consciência

Mônadas controlam Efeitos

Haskell: efeitos só podem acontecer dentro de mônadas

Page 35: Programação Funcional: Novos Horizontes para a Expansão da Consciência

Mônadas controlam Efeitos

Experiência: maior parte do código não precisa de efeitos

Page 36: Programação Funcional: Novos Horizontes para a Expansão da Consciência

Efeitos e Concorrência

Se não há efeitos compartilhados, paralelizar é trivial.

Page 37: Programação Funcional: Novos Horizontes para a Expansão da Consciência

“once you get the hang of it, functional programming is really fun”

JavaScript: The Good Parts, Douglas Crockford

Page 38: Programação Funcional: Novos Horizontes para a Expansão da Consciência

Para Aprender Mais

mitpress.mit.edu/sicp

Page 39: Programação Funcional: Novos Horizontes para a Expansão da Consciência

Para Aprender Mais

htdp.org

Page 40: Programação Funcional: Novos Horizontes para a Expansão da Consciência

Para Aprender Mais

The FunctionalApproach to Programming

Page 41: Programação Funcional: Novos Horizontes para a Expansão da Consciência

Obrigado!@andreiformiga