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

Post on 26-May-2015

1.988 views 1 download

Transcript of 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

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