Por que voce precisa (re)aprender linguagens funcionais

33
Por que você precisa (re)aprender linguagens funcionais? Luiz Borba Maio-2010

description

Apresentação feita no CESA|R

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

Page 1: Por que voce precisa (re)aprender linguagens funcionais

Por que você precisa (re)aprender linguagens

funcionais?Luiz BorbaMaio-2010

Page 2: Por que voce precisa (re)aprender linguagens funcionais

Alonzo Church – anos 30cálculo lâmbda

λx.x + 1

(λx.x + 1) 3 = 4

Page 3: Por que voce precisa (re)aprender linguagens funcionais

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))))))

Page 4: Por que voce precisa (re)aprender linguagens funcionais

Haskell – 1990

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

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

Page 5: Por que voce precisa (re)aprender linguagens funcionais

Mainstream

• Desde os anos 60• Imperativa Procedural (Cobol,

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

(Smalltalk, C++, Java)

Page 6: Por que voce precisa (re)aprender linguagens funcionais

E como ficou o paradigma funcional?

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

Page 7: Por que voce precisa (re)aprender linguagens funcionais

Mas, de repente...

Page 8: Por que voce precisa (re)aprender linguagens funcionais

Sinais

Page 9: Por que voce precisa (re)aprender linguagens funcionais

Erlang – Ericsson Language

• Criada em 1986• 1998• AXD301 – confiabilidade de

99.9999999%• Banida e disponibilizada como

open source• 2004• Reintroduzida na Ericsson

Page 10: Por que voce precisa (re)aprender linguagens funcionais

Microsoft F#

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

um add-on• Será parte integrante do Visual

Studio 2010

Page 11: Por que voce precisa (re)aprender linguagens funcionais

Clojure

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

Page 12: Por que voce precisa (re)aprender linguagens funcionais

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)

}

Page 13: Por que voce precisa (re)aprender linguagens funcionais

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, ...

Page 14: Por que voce precisa (re)aprender linguagens funcionais

Que diabos tá acontecendo?

Page 15: Por que voce precisa (re)aprender linguagens funcionais

Evolução das CPUs

Page 16: Por que voce precisa (re)aprender linguagens funcionais

“Software is getting slower faster than hardware

becomes faster” (Nicklaus Wirth)

Page 17: Por que voce precisa (re)aprender linguagens funcionais

código existente será obsoleto

Page 18: Por que voce precisa (re)aprender linguagens funcionais

temos que escrever código paralelo

Page 19: Por que voce precisa (re)aprender linguagens funcionais

QUEM SABE FAZER?

Page 20: Por que voce precisa (re)aprender linguagens funcionais

usando conceitos funcionais é mais

fácil

Page 21: Por que voce precisa (re)aprender linguagens funcionais

Funções de Alta Ordem

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

Page 22: Por que voce precisa (re)aprender linguagens funcionais

Imutabilidade

let price = 10

Page 23: Por que voce precisa (re)aprender linguagens funcionais

Sem efeitos colaterais

Page 24: Por que voce precisa (re)aprender linguagens funcionais

Pattern Matching

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

Page 25: Por que voce precisa (re)aprender linguagens funcionais

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() } } } } }

Page 26: Por que voce precisa (re)aprender linguagens funcionais

Outros conceitos chaves

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

Page 27: Por que voce precisa (re)aprender linguagens funcionais

Então vou fazer todos os meus novos

sistemas usando linguagens funcionais?

Page 28: Por que voce precisa (re)aprender linguagens funcionais

NÃO

Page 29: Por que voce precisa (re)aprender linguagens funcionais

Vamos usar linguagens que tenham um mix

de paradigmas

Page 30: Por que voce precisa (re)aprender linguagens funcionais

Funcional, Imperativa e Orientada a Objetos

Page 31: Por que voce precisa (re)aprender linguagens funcionais

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

Page 32: Por que voce precisa (re)aprender linguagens funcionais

Precisamos aprender linguagens funcionais

para escrever o software do futuro.

Page 33: Por que voce precisa (re)aprender linguagens funcionais

Perguntas?

[email protected]