SlideShare uma empresa Scribd logo
1 de 61
Baixar para ler offline
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

Mais conteúdo relacionado

Destaque

Subversion client
Subversion clientSubversion client
Subversion clientrchakra
 
Silverlight Developer Introduction
Silverlight   Developer IntroductionSilverlight   Developer Introduction
Silverlight Developer IntroductionTomy Ismail
 
Intervalo técnico Git/SVN
Intervalo técnico Git/SVNIntervalo técnico Git/SVN
Intervalo técnico Git/SVNLuciano Lima
 
高级英语全国2008年10月高等教育自学考试
高级英语全国2008年10月高等教育自学考试高级英语全国2008年10月高等教育自学考试
高级英语全国2008年10月高等教育自学考试guest2bb065
 
Subversion workshop
Subversion workshopSubversion workshop
Subversion workshopTrafeX
 
Introduction to Subversion
Introduction to SubversionIntroduction to Subversion
Introduction to SubversionAtul Jha
 
02.28.13 WANDisco SVN Training: Getting Info Out of SVN
02.28.13 WANDisco SVN Training: Getting Info Out of SVN02.28.13 WANDisco SVN Training: Getting Info Out of SVN
02.28.13 WANDisco SVN Training: Getting Info Out of SVNWANdisco Plc
 
Extending VuGen 11.5 with custom add-ins
Extending VuGen 11.5 with custom add-insExtending VuGen 11.5 with custom add-ins
Extending VuGen 11.5 with custom add-insstuartmoncrieff
 
Version Control With Subversion
Version Control With SubversionVersion Control With Subversion
Version Control With SubversionSamnang Chhun
 
SVN Best Practices
SVN Best PracticesSVN Best Practices
SVN Best Practicesabackstrom
 
02.19.13 WANDisco SVN Training: Branching Options for Development
02.19.13 WANDisco SVN Training: Branching Options for Development02.19.13 WANDisco SVN Training: Branching Options for Development
02.19.13 WANDisco SVN Training: Branching Options for DevelopmentWANdisco Plc
 
Subversion Overview
Subversion OverviewSubversion Overview
Subversion Overviewpolarion
 
datastage training | datastage online training | datastage training videos | ...
datastage training | datastage online training | datastage training videos | ...datastage training | datastage online training | datastage training videos | ...
datastage training | datastage online training | datastage training videos | ...Nancy Thomas
 

Destaque (20)

Subversion client
Subversion clientSubversion client
Subversion client
 
Silverlight Developer Introduction
Silverlight   Developer IntroductionSilverlight   Developer Introduction
Silverlight Developer Introduction
 
PHP Con09: SVN Advanced
PHP Con09: SVN AdvancedPHP Con09: SVN Advanced
PHP Con09: SVN Advanced
 
Intervalo técnico Git/SVN
Intervalo técnico Git/SVNIntervalo técnico Git/SVN
Intervalo técnico Git/SVN
 
高级英语全国2008年10月高等教育自学考试
高级英语全国2008年10月高等教育自学考试高级英语全国2008年10月高等教育自学考试
高级英语全国2008年10月高等教育自学考试
 
Subversion
SubversionSubversion
Subversion
 
Tortoise svn 1.8.1-en
Tortoise svn 1.8.1-enTortoise svn 1.8.1-en
Tortoise svn 1.8.1-en
 
Subversion workshop
Subversion workshopSubversion workshop
Subversion workshop
 
svn
svnsvn
svn
 
Introduction to Subversion
Introduction to SubversionIntroduction to Subversion
Introduction to Subversion
 
Git para quem vem do SVN
Git para quem vem do SVNGit para quem vem do SVN
Git para quem vem do SVN
 
02.28.13 WANDisco SVN Training: Getting Info Out of SVN
02.28.13 WANDisco SVN Training: Getting Info Out of SVN02.28.13 WANDisco SVN Training: Getting Info Out of SVN
02.28.13 WANDisco SVN Training: Getting Info Out of SVN
 
Extending VuGen 11.5 with custom add-ins
Extending VuGen 11.5 with custom add-insExtending VuGen 11.5 with custom add-ins
Extending VuGen 11.5 with custom add-ins
 
Introduce to SVN
Introduce to SVNIntroduce to SVN
Introduce to SVN
 
Version Control With Subversion
Version Control With SubversionVersion Control With Subversion
Version Control With Subversion
 
SVN Best Practices
SVN Best PracticesSVN Best Practices
SVN Best Practices
 
02.19.13 WANDisco SVN Training: Branching Options for Development
02.19.13 WANDisco SVN Training: Branching Options for Development02.19.13 WANDisco SVN Training: Branching Options for Development
02.19.13 WANDisco SVN Training: Branching Options for Development
 
Git vs. SVN
Git vs. SVNGit vs. SVN
Git vs. SVN
 
Subversion Overview
Subversion OverviewSubversion Overview
Subversion Overview
 
datastage training | datastage online training | datastage training videos | ...
datastage training | datastage online training | datastage training videos | ...datastage training | datastage online training | datastage training videos | ...
datastage training | datastage online training | datastage training videos | ...
 

Semelhante a Scala Promessa Funcional

TDC2018SP | Trilha Ruby - Programacao funcional com Ruby, potencialize e simp...
TDC2018SP | Trilha Ruby - Programacao funcional com Ruby, potencialize e simp...TDC2018SP | Trilha Ruby - Programacao funcional com Ruby, potencialize e simp...
TDC2018SP | Trilha Ruby - Programacao funcional com Ruby, potencialize e simp...tdc-globalcode
 
Por que dizemos que Scala é uma linguagem funcional?
Por que dizemos que Scala é uma linguagem funcional?Por que dizemos que Scala é uma linguagem funcional?
Por que dizemos que Scala é uma linguagem funcional?pmatiello
 
Programação funcional
Programação funcionalProgramação funcional
Programação funcionalLP Maquinas
 
Estrutura de dados - Lista Circular Duplamente Encadeada e Matriz Esparsa
Estrutura de dados - Lista Circular Duplamente Encadeada e Matriz EsparsaEstrutura de dados - Lista Circular Duplamente Encadeada e Matriz Esparsa
Estrutura de dados - Lista Circular Duplamente Encadeada e Matriz EsparsaLucas Sabadini
 
Três anos de Scala no NewsMonitor
Três anos de Scala no NewsMonitorTrês anos de Scala no NewsMonitor
Três anos de Scala no NewsMonitorFelipe Hummel
 
IEEEweek 2017 @ DETI Univ. Aveiro - Workshop Python
IEEEweek 2017 @ DETI Univ. Aveiro - Workshop PythonIEEEweek 2017 @ DETI Univ. Aveiro - Workshop Python
IEEEweek 2017 @ DETI Univ. Aveiro - Workshop PythonDiogo Gomes
 
Functional programming for Old Object Oriented Developers
Functional programming for Old Object Oriented Developers Functional programming for Old Object Oriented Developers
Functional programming for Old Object Oriented Developers Alan Prando
 

Semelhante a Scala Promessa Funcional (11)

TDC2018SP | Trilha Ruby - Programacao funcional com Ruby, potencialize e simp...
TDC2018SP | Trilha Ruby - Programacao funcional com Ruby, potencialize e simp...TDC2018SP | Trilha Ruby - Programacao funcional com Ruby, potencialize e simp...
TDC2018SP | Trilha Ruby - Programacao funcional com Ruby, potencialize e simp...
 
Por que dizemos que Scala é uma linguagem funcional?
Por que dizemos que Scala é uma linguagem funcional?Por que dizemos que Scala é uma linguagem funcional?
Por que dizemos que Scala é uma linguagem funcional?
 
Programação funcional
Programação funcionalProgramação funcional
Programação funcional
 
UML - parte 1
UML - parte 1UML - parte 1
UML - parte 1
 
Introdução ao paradigma funcional com scala
Introdução ao paradigma funcional com scalaIntrodução ao paradigma funcional com scala
Introdução ao paradigma funcional com scala
 
INATEL - Matlab introdução
INATEL - Matlab introduçãoINATEL - Matlab introdução
INATEL - Matlab introdução
 
Estrutura de dados - Lista Circular Duplamente Encadeada e Matriz Esparsa
Estrutura de dados - Lista Circular Duplamente Encadeada e Matriz EsparsaEstrutura de dados - Lista Circular Duplamente Encadeada e Matriz Esparsa
Estrutura de dados - Lista Circular Duplamente Encadeada e Matriz Esparsa
 
Apostila rpira
Apostila rpiraApostila rpira
Apostila rpira
 
Três anos de Scala no NewsMonitor
Três anos de Scala no NewsMonitorTrês anos de Scala no NewsMonitor
Três anos de Scala no NewsMonitor
 
IEEEweek 2017 @ DETI Univ. Aveiro - Workshop Python
IEEEweek 2017 @ DETI Univ. Aveiro - Workshop PythonIEEEweek 2017 @ DETI Univ. Aveiro - Workshop Python
IEEEweek 2017 @ DETI Univ. Aveiro - Workshop Python
 
Functional programming for Old Object Oriented Developers
Functional programming for Old Object Oriented Developers Functional programming for Old Object Oriented Developers
Functional programming for Old Object Oriented Developers
 

Scala Promessa Funcional