Apresentação no FORTES 2013 (Fórum de Tecnologias e Engenharia de Software). Aborda a motivação do porquê estudar Scala, quais os benefícios da programação funcional e recursos de Scala.
Functional programming for Old Object Oriented Developers
Scala Promessa Funcional
1. Scala
Linguagem Promissora e Funcional
Michael Schuenck dos Santos
@michaelss
TRE-TO
quinta-feira, 25 de abril de 13
2. 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
11. 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
12. Performance
O Google fez um benchmark entre
C++, Java, Scala e Go
Uso de memória
quinta-feira, 25 de abril de 13
30. 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
35. 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
36. Imutabilidade
val x = “Olá”
x = “Oi” // Erro
var y = “Olá”
y = “Oi” // Ok
Paradigma Funcional
quinta-feira, 25 de abril de 13
37. 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
38. 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
39. 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
40. 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
41. Currying
def mul(x: Int) = (y: Int) => x * y
Paradigma Funcional
quinta-feira, 25 de abril de 13
42. Currying
def mul(x: Int) = (y: Int) => x * y
mul(6)(7)
Paradigma Funcional
quinta-feira, 25 de abril de 13
43. 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
45. 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
46. 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
47. 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
48. 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
49. 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
50. 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
51. 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
61. Scala
Linguagem Promissora e Funcional
Michael Schuenck dos Santos
@michaelss
TRE-TO
if (abertoPerguntas())
publico.perguntar()
quinta-feira, 25 de abril de 13