Por que você precisa (re)aprender linguagens funcionais? Luiz Borba Maio-2010
Alonzo Church – anos 30 cá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 &quot;Empty stack&quot;
Actors Model class 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(&quot;Ping: pong&quot;)  if (pingsLeft > 0) {  pong ! Ping  pingsLeft -= 1  } else { println(&quot;Ping: stop&quot;) 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? [email_address]

Por que voce precisa (re)aprender linguagens funcionais