Scala
Linguagem 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
Twitter
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 Odersky
Prof. na Univ. de
Lausanne
(Suíça)
Criador de Generics e
do compilador Java
quinta-feira, 25 de abril de 13
Performance
O Google fez um benchmark entre
C++, Java, Scala e Go
Uso de memória
quinta-feira, 25 de abril de 13
Performance
Tempo
quinta-feira, 25 de abril de 13
Performance
Linhas de código
quinta-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ão
Características
quinta-feira, 25 de abril de 13
Alto Nível
Caracterí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 = 10
println(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)
int
double
float
boolean
byte
short
Int
Double
Float
Boolean
Byte
Short
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
Estrutura
Retorno:
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 Funcional
quinta-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 + b
op(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 * y
mul(6)(7)
Paradigma Funcional
quinta-feira, 25 de abril de 13
Currying
def mul(x: Int) = (y: Int) => x * y
mul(6)(7) (y: Int) => 6 * y
Paradigma Funcional
quinta-feira, 25 de abril de 13
Recursos de Scala
quinta-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
Traits
trait 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
Atores
Recursos 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
Scala
Linguagem Promissora e Funcional
Michael Schuenck dos Santos
@michaelss
TRE-TO
if (abertoPerguntas())
publico.perguntar()
quinta-feira, 25 de abril de 13

Scala: Linguagem Promissora e Funcional