Por que voce precisa (re)aprender linguagens funcionais

Post on 20-Jan-2015

3.568 views 0 download

description

Apresentação feita no CESA|R

Transcript of Por que voce precisa (re)aprender linguagens funcionais

Por que você precisa (re)aprender linguagens

funcionais?Luiz BorbaMaio-2010

Alonzo Church – anos 30cálculo lâmbda

λx.x + 1

(λx.x + 1) 3 = 4

LISP – 1958

(defun quicksort (lis) (if (null lis) nil (let* ((x (car lis)) (r (cdr lis)) (fn (lambda (a) (< a x)))) (append (quicksort (remove-if-not fn r)) (list x) (quicksort (remove-if fn r))))))

Haskell – 1990

qsort [] = [] qsort (x:xs) = qsort (filter (< x) xs)

++ [x] ++ qsort (filter (>= x) xs)

Mainstream

• Desde os anos 60• Imperativa Procedural (Cobol,

Fortran, C)• e depois...• Imperativa Orientada a Objetos

(Smalltalk, C++, Java)

E como ficou o paradigma funcional?

• Basicamente na academia• Desde de meados dos anos 90• Completamente esquecido

Mas, de repente...

Sinais

Erlang – Ericsson Language

• Criada em 1986• 1998• AXD301 – confiabilidade de

99.9999999%• Banida e disponibilizada como

open source• 2004• Reintroduzida na Ericsson

Microsoft F#

• Criada em 2002• Incluída no Visual Studio 2008 como

um add-on• Será parte integrante do Visual

Studio 2010

Clojure

• Criada em 2007• Dialeto moderno de LISP• Roda na JVM

Scala

• Criada em 2003• Funcional + Orientada a Objetos• Linguagem “pós-funcional“• Backend do Twitter

def qsort: List[Int] => List[Int] = {

case Nil => Nil

case pivot :: tail =>

val (smaller, rest) = tail.partition(_ < pivot)

qsort(smaller) ::: pivot :: qsort(rest)

}

Bancos NOSQL

• Google - Paper em 2007 sobre BigTable• Map/Reduce

• Explosão de soluções• CouchDB, MongoDB, Neo4j, Redis,

Memcachedb, Dynamo, Cassandra, Voldermort, HBase, Hypertable, FluidDB, Riak, RavenDB, Dynomite, ...

Que diabos tá acontecendo?

Evolução das CPUs

“Software is getting slower faster than hardware

becomes faster” (Nicklaus Wirth)

código existente será obsoleto

temos que escrever código paralelo

QUEM SABE FAZER?

usando conceitos funcionais é mais

fácil

Funções de Alta Ordem

def apply(f:Int => String, v:Int) = f(v)

Imutabilidade

let price = 10

Sem efeitos colaterais

Pattern Matching

let peek s =    match s with    | Cons(hd, tl) -> hd    | Nil -> failwith "Empty stack"

Actors Modelclass Ping(count: int, pong: Actor) extends Actor { def act() { var pingsLeft = count – 1 pong ! Ping while (true) { receive { case Pong => if (pingsLeft % 1000 == 0) println("Ping: pong") if (pingsLeft > 0) { pong ! Ping pingsLeft -= 1 } else { println("Ping: stop") pong ! Stop exit() } } } } }

Outros conceitos chaves

• Recursion• Currying• Lazy Evaluation• Continuations• Closures• Functional Composition• Referential Transparency• Monads

Então vou fazer todos os meus novos

sistemas usando linguagens funcionais?

NÃO

Vamos usar linguagens que tenham um mix

de paradigmas

Funcional, Imperativa e Orientada a Objetos

Scala, C#, F# e Java (?)

Precisamos aprender linguagens funcionais

para escrever o software do futuro.

Perguntas?

borba@cesar.org.br