View
1.988
Download
1
Category
Preview:
Citation preview
Programação Funcional: Novos Horizontes para a
Expansão da Consciência
Andrei de Araújo Formiga@andreiformiga
Escolas de Magia
Abjuration
Transmutation
Conjuration
Divination
Enchantment
Evocation
Illusion
Necromancy
Por que?
Novos pontos de vista
Novas formas de fazer magia
Escolas de Programação
Programação ImperativaMáquinas de Turing
Escolas de Programação
Programação FuncionalLambda-cálculoSistemas de reescrita
Programação Imperativa
Efeitos colaterais são vitais
Computação = alterações no estado da memória
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
Efeitos = Dificuldades
Otimizações
Análises estáticas SegurançaCorretude
Compartilhamento e Concorrência
Sem Efeitos?
O mundo muda por causa dos efeitos?
Solução: Controlar Efeitos
OO: Encapsulamento
Passagem de MensagensEstado local não compartilhado
Programação Funcional
Funções como conceito básicoCidadãos de 1a classe
Efeitos colaterais controladosDiferentes níveis de controle
Características
Funções de alta ordem
Inferência de tipos
Pattern matching
Tipos de Dados Algébricos
Características
Polimorfismo (genéricos)
Avaliação preguiçosa (lazy)
Continuações
Mônadas e Sistemas de Efeitos
Pesquisa e Inovação
Tradição de Pesquisa em linguagens funcionais
Muitas inovações surgiram 1o nas linguagens funcionais
Fama de paradigma “acadêmico”
Tipos fantasmas, mônadas, catamorfismos, anamorfismos, GADTs…
Linguagens
Scheme
Standard ML / OCaml / F#
Haskell
Scala
Erlang
Clojure
Será JavaScript uma Linguagem Funcional?
“JavaScript is the first lambda language to go mainstream”
JavaScript: The Good Parts, Douglas Crockford
Funções de Alta Ordem
Funções que usam funções
Funções de 1a classe
JavaScript tem isso
Funções em JS
Funções anônimas e closures
Callbacks e Eventos
HOFs tradicionais
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]
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
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
Anamorfismo = reduce
Mônadas
Um construtor + 2 funções/métodosreturnbind
Monad laws
Mônadas são Padrões
Coleções
Quebrar + processar + retornar
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)
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()) );}
Mônadas em JS
var cookie2 = cookie1.bind(morfar)
Mônadas controlam Efeitos
Haskell: efeitos só podem acontecer dentro de mônadas
Mônadas controlam Efeitos
Experiência: maior parte do código não precisa de efeitos
Efeitos e Concorrência
Se não há efeitos compartilhados, paralelizar é trivial.
“once you get the hang of it, functional programming is really fun”
JavaScript: The Good Parts, Douglas Crockford
Para Aprender Mais
mitpress.mit.edu/sicp
Para Aprender Mais
htdp.org
Para Aprender Mais
The FunctionalApproach to Programming
Obrigado!@andreiformiga
Recommended