Post on 20-Jan-2015
description
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