ScalaLinguagem Promissora e Funcional
Michael Schuenck dos Santos@michaelss
TRE-TO
quinta-feira, 25 de abril de 13
Eu
• Bacharel em Sistemas de Informação pelo CEULP/ULBRA e ex-professor
• Mestre em Sistemas e Computação pela UFRN e ex-professor
• Analista de Sistemas no TRE-TO
quinta-feira, 25 de abril de 13
“Iluminar sua mente???”
quinta-feira, 25 de abril de 13
Java x .NET
quinta-feira, 25 de abril de 13
Por que o interesse em Scala?
quinta-feira, 25 de abril de 13
Por que o interesse em Scala?
quinta-feira, 25 de abril de 13
A Infra e a JVM
Por que o interesse em Scala?
quinta-feira, 25 de abril de 13
Paradigma Funcional
Por que o interesse em Scala?
quinta-feira, 25 de abril de 13
Interesse por LP’s
Por que o interesse em Scala?
quinta-feira, 25 de abril de 13
quinta-feira, 25 de abril de 13
História
2001 2003 2004
Início do projeto de
Scala
Redesign: versão 2.0
Primeiro release
público, para a JVM
2006
Liberada para .NET
2011
Martin Odersky funda a Typesafe, que logo
recebe um investimento de US$ 3 milhões
Martin OderskyProf. na Univ. de Lausanne(Suíça)
Criador de Generics e do compilador Java
quinta-feira, 25 de abril de 13
PerformanceO Google fez um benchmark entre
C++, Java, Scala e Go
Uso de memóriaquinta-feira, 25 de abril de 13
Performance
Tempoquinta-feira, 25 de abril de 13
Performance
Linhas de códigoquinta-feira, 25 de abril de 13
Quem está usando
quinta-feira, 25 de abril de 13
Características
quinta-feira, 25 de abril de 13
Uso de {chaves}
Características
Muitas vezes dispensáveis
quinta-feira, 25 de abril de 13
Uso de {chaves}
Características
; só com mais de uma expressão por linha
quinta-feira, 25 de abril de 13
ConcisãoCaracterísticas
quinta-feira, 25 de abril de 13
Alto NívelCaracterísticas
quinta-feira, 25 de abril de 13
Características
Tipagem Estática
quinta-feira, 25 de abril de 13
Características
Tipagem Estática
• Erros em tempo de compilação
quinta-feira, 25 de abril de 13
Características
Tipagem Estática
• Erros em tempo de compilação
• Refatorações seguras
quinta-feira, 25 de abril de 13
Características
Tipagem Estática
• Erros em tempo de compilação
• Refatorações seguras
• Scala: inferência de tipos
quinta-feira, 25 de abril de 13
Documentação, Clareza e Previsibilidade
var a = “Palmas”if (b == 0) a = 10println(a * 2) ?
Características
quinta-feira, 25 de abril de 13
Tipagem
C#C++
Estática Dinâmica
JS
Características
quinta-feira, 25 de abril de 13
Características
OO
Funcional
quinta-feira, 25 de abril de 13
Paradigma
OO Funcional
C# Haskell Scheme
LispSmalltalk F#
quinta-feira, 25 de abril de 13
OO(Scala) > OO(Java)
quinta-feira, 25 de abril de 13
Não se utiliza os tipos primitivos
OO(Scala) > OO(Java)
intdouble
floatboolean
byteshort
IntDoubleFloat
BooleanByteShort
quinta-feira, 25 de abril de 13
Operadores unários e binários são métodos
OO(Scala) > OO(Java)
1 + 2==
1.+(2)quinta-feira, 25 de abril de 13
EstruturaRetorno:
obrigatório em funções recursivas
Dispensável se retorno Unit
Parâmetros
return desnecessário
Argumento padrão
obrigatórias p/ mais de uma linha
quinta-feira, 25 de abril de 13
Paradigma Funcionalquinta-feira, 25 de abril de 13
Interesse crescente:Resolver o problema
de multicores
Paradigma Funcional
quinta-feira, 25 de abril de 13
OO Funcional
Composição de objetos
Composição de funções
Alteração de estado
Ausência de efeitos colaterais
Algoritmos iterativos
Algoritmos recursivos
Paradigma Funcional
quinta-feira, 25 de abril de 13
Imutabilidade
val x = “Olá”x = “Oi” // Erro
var y = “Olá”y = “Oi” // Ok
Paradigma Funcional
quinta-feira, 25 de abril de 13
Funções de Ordem Superior
Podem ser passadas e retornadas
def op(x: Int, y: Int, f: (Int, Int) => Int): Int = f(x, y)
Paradigma Funcional
quinta-feira, 25 de abril de 13
Funções de Ordem Superior
Podem ser passadas e retornadas
def op(x: Int, y: Int, f: (Int, Int) => Int): Int = f(x, y)
def soma(a: Int, b: Int) = a + bop(1, 2, soma)
Paradigma Funcional
quinta-feira, 25 de abril de 13
Funções Anônimas
def op(x: Int, y: Int, f: (Int, Int) => Int): Int = f(x, y)
op(1, 2, (a: Int, b: Int) => a + b)
Paradigma Funcional
quinta-feira, 25 de abril de 13
Funções Anônimas
def op(x: Int, y: Int, f: (Int, Int) => Int): Int = f(x, y)
op(1, 2, (a: Int, b: Int) => a + b)
Paradigma Funcional
quinta-feira, 25 de abril de 13
Currying
def mul(x: Int) = (y: Int) => x * y
Paradigma Funcional
quinta-feira, 25 de abril de 13
Currying
def mul(x: Int) = (y: Int) => x * ymul(6)(7)
Paradigma Funcional
quinta-feira, 25 de abril de 13
Currying
def mul(x: Int) = (y: Int) => x * ymul(6)(7) (y: Int) => 6 * y
Paradigma Funcional
quinta-feira, 25 de abril de 13
Recursos de Scalaquinta-feira, 25 de abril de 13
for
for (i <- 1 to 10) println(i)
for (i <- 1 to 9; j <- 1 to 9) println(i)
for (i <- 1 to 9 if i != 5) println(i)
val x = for (i <- 1 to 9) yield i * i//(1, 4, 9, 16, 25, 36, ..., 81)
Recursos de Scala
quinta-feira, 25 de abril de 13
O método apply
• Uma espécie de método padrão
“Michael”(1) // “i”
Classe String tem o método:
def apply(n: Int): Char
Recursos de Scala
quinta-feira, 25 de abril de 13
Pré-condições
class Racional(x: Int, y: Int) { require(y > 0, “Denominador deve ser positivo”) ...}
Recursos de Scala
quinta-feira, 25 de abril de 13
Traitstrait Plural { def pluralizar(x: String) = x + “s”}
trait Dupla { def duplicar(x: String) = x + x}
class MyString(x: String) extends Plural with Dupla { }
Recursos de Scala
quinta-feira, 25 de abril de 13
Pattern Matching
var sinal = ...val ch: Char = ...
ch match { case ‘+’ => sinal = 1 case ‘-’ => sinal = -1 case _ => sinal = 0}
Recursos de Scala
quinta-feira, 25 de abril de 13
Pattern Matching (2)
var sinal = ...val ch: Char = ...
sinal = ch match { case ‘+’ => 1 case ‘-’ => -1 case _ => 0}
Recursos de Scala
quinta-feira, 25 de abril de 13
Pattern Matching (3)
def getInt(obj: Any) = obj match { case x: Int => x case s: String => Integer.parseInt(s) case _: BigInt => Int.MaxValue case _=> 0}
Recursos de Scala
quinta-feira, 25 de abril de 13
AtoresRecursos de Scala
≅quinta-feira, 25 de abril de 13
Otimização de Tail-Recursion
Tail-recursion: não é necessário computar o resultado de chamadas recursivas
Recursos de Scala
quinta-feira, 25 de abril de 13
REPL: Read-Evaluate-Print Loop
quinta-feira, 25 de abril de 13
Frameworks
quinta-feira, 25 de abril de 13
Adoção
quinta-feira, 25 de abril de 13
Nivelamento da Equipe
Adoção
quinta-feira, 25 de abril de 13
• Curva de aprendizado
• Código Java-like no início
• Uso das demais funcionalidades de Scala depois
Adoção
quinta-feira, 25 de abril de 13
• Comunidade pequena, mas crescente
• Acessível
• Scala Days scaladays.org
Adoção
quinta-feira, 25 de abril de 13
Recursos
• http://twitter.github.com/scala_school/
• http://twitter.github.com/effectivescala/
• https://www.coursera.org/course/progfun
• E livros (só em inglês por enquanto)
quinta-feira, 25 de abril de 13
ScalaLinguagem Promissora e Funcional
Michael Schuenck dos Santos@michaelss
TRE-TO
if (abertoPerguntas()) publico.perguntar()
quinta-feira, 25 de abril de 13
Top Related