SlideShare uma empresa Scribd logo
1 de 58
Baixar para ler offline
Introdução ao Paradigma
Funcional com Scala
Gustavo Fernandes dos Santos
gfdsantos@inf.ufpel.edu.br
Paradigma Funcional
● É um paradigma de programação que trata a computação como avaliações de
expressões onde é evitado a mudança de estados durante a execução do
programa e utiliza dados imutáveis.
Paradigma Funcional?
Imperativo Declarativo
Procedural
Orientado a
Objetos
Funcional Lógico
C, Pascal...
C++, Java,
Python...
Haskell, Lisp... Prolog, Datalog....
Linguagens funcionais
● Linguagens puras (Não possuem o conceito de memória)
○ Haskell
○ Miranda
● Linguagens impuras (Possuem o conceito de memória)
○ Scala
○ Erlang
○ F#
○ OCaml
○ JavaScript
Características
● Funções de Primeira Classe e de Alta Ordem
○ Primeira Classe: permite a atribuição de funções a valores ou
armazenamento em estruturas de dados
○ Alta Ordem: permite receber e retornar uma função de outra função
● Funções puras
● Recursão
● Avaliação rigorosa e preguiçosa: Forma com que os argumentos são
avaliados numa expressão.
○ Rigorosa: Todos argumentos são processados no momento da avaliação
○ Preguiçosa: Os argumentos não são processados durante a sua avaliação
● Sistema de tipos
Por que Funcional?
“Because the life is too short for imperative programming”
John Hughes
Mãos na massa
def qs(l: List[Int]): List[Int] = l match {
case Nil => Nil
case h::t => qs(t filter {_ < h}) ::: h :: qs(t filter {_ >= h})
}
Mãos na massa
def t(n:Int) = (0 to 10) map { _*n } filter { _<50 }
Mãos na massa
def t(n:Int) = (0 to 10) map { _*n } filter { _<50 }
Sentido da computação
Exemplo 1
int *t(int n) {
int vet[11];
for (i = 0; i <= 10; i++) {
vet[i] = i*n;
}
return *vet;
}
Exemplo 1
def t(n: Int) = (0 to 10) map { (x) => x * n }
let t n = [0 .. 10] |> List.map (fun x => x * n)
t n = map (x -> x * n) [0 .. 10]
Por que Funcional?
def t(n: Int) = (0 to 10) map { (x) => x * n }
int *t(int n) {
int vet[11];
for (i = 0; i <= 10; i++) {
vet[i] = i*n;
}
return *vet;
}
Por que Funcional?
E se eu quiser retornar somente os números pares da tabuada de
qualquer número? Ou um intervalo? Ou os valores maiores que um
certo valor?
Exemplo 2
int *tabuada(int n) {
int vet[11];
for (i = 0; i <= 10; i++) {
if ( (i*n)%2 == 0 )
vet[i] = i*n;
}
return *vet;
}
Exemplo 2
def tabuada(n: Int) = (0 to 10) map {_*n} filter {_%2 == 0}
let tabuada n = [0..10] |>
List.map(fun x -> x * n) |>
List.filter (fun x -> x % 2 = 0)
tabuada n = filter (p -> mod p 2 == 0) (map (x -> x * n) [0..
10])
Por que Funcional?
● Sem:
○ Variáveis
○ Estruturas de repetição
○ Ponteiros
○ Mutabilidade
● Com:
○ Funções de alta ordem
○ Recursão
○ Avaliação preguiçosa
Por que Funcional?
● SEM VARIÁVEIS?
● SEM ESTRUTURAS DE REPETIÇÃO?
Funcional + OO?
É possível?
Funcional + OO?
Scala
Scalable Language
Martin Odersky
Escola Politécnica Federal de Lausanne (EPFL)
www.scala-lang.org
Quem usa Scala?
Quem usa Scala?
Por que?
+
Java?
● Interoperabilidade
Java!
Java!
import java.util.Scanner
object Programa {
def main(args: Array[String]) {
val scn = new Scanner(System.in)
val linha = scn.nextLine
println(linha)
}
}
Começando
val, var
Começando
def
Começando
map, filter, reduce
Começando
def soma1(x: Int, y: Int) = x + y
def soma2(x: Int)(y: Int) = x + y
(0 to 5) map { soma2(1) }
(‘a’ to ‘g’) filter { c => c != ‘e’ }
(0 to 5) reduce { soma1 }
Começando
1 + 2 = (1).+(2)
Características do Scala
● Scala REPL (Read Evaluate Print Loop)
● Otimização de chamadas recursivas em cauda
● Funções de alta ordem e de primeira classe
● Açucares sintáticos (Syntax Sugar)
● Casamento de Padrões (Pattern Matching)
● Interoperabilidade
● Suporte completo ao paradigma funcional
● Suporte completo ao paradigma orientado a objetos
● Linguagem hibrida (Multiparadigma)
● ...
Scala REPL
Otimização de chamadas recursivas em
cauda
● Somente funções “recursivas em cauda” podem ser otimizadas
● Usa-se a anotação tailrec
● Evita o “Stackoverflow”
Otimização de chamadas recursivas em
cauda
● Somente funções “recursivas em cauda” podem ser otimizadas
● Usa-se a anotação tailrec
● Evita o “Stackoverflow”
● O Fatorial
Otimização de chamadas recursivas em
cauda
● Somente funções “recursivas em cauda” podem ser otimizadas
● Usa-se a anotação tailrec
● Evita o “Stackoverflow”
● O Fatorial
def fatorial(n: Int): Int = if (n == 1) 1 else n*fatorial(n-1)
Otimização de chamadas recursivas em
cauda
● Somente funções “recursivas em cauda” podem ser otimizadas
● Usa-se a anotação tailrec
● Evita o “Stackoverflow”
● O Fatorial
def fatorial(n: Int): Int = if (n == 1) 1 else n*fatorial(n-1)
@annotation.tailrec
def fat(n: Int, acum: Int = 1): Int = if (n == 1) acum else fat(n-1, n*acum)
Funções de alta ordem
● Linguagens de programação com suporte a funções de alta ordem, encaram
uma função da mesma forma como uma linguagem imperativa, como C++,
encara uma variável.
● Funções podem ser passadas como argumentos para outras funções
● Funções podem ser retornadas de outras funções
● Funções podem ser compostas
● Funções podem ser atribuídas
● ...
Funções de alta ordem
● Um exemplo de funções de alta ordem pode ser visto no Cálculo, onde o
operador d/dx retorna a derivada de uma função f.
d/dx(x²) = 2x
Funções de alta ordem
C++
…
function<int, int> soma = [](x, y) { return (x + y); };
…
Scala
val soma = (x: Int, y: Int) => x + y
Funções de alta ordem
val f = (x: Int) => 2 * x
def g(f: Int => Int, x: Int) = f(x)
println(g(f, 3))
Funções de alta ordem
val f = (x: Int) => 2 * x
def m[A,B](f: (A) => B, l: List[A]): List[B] = l match {
case Nil => Nil
case h::t => f(h)::m(f, t)
}
Pattern Matching (Switch com super poderes)
● Verifica um dado padrão em um conjunto de dados
def maiorque(x: Int, y: Int) = {
(x, y) match {
case (x, y) if x > y => true
case (x, y) if x < y => false
case _ => false
}
}
Pattern Matching
● Verifica um dado padrão em um conjunto de dados
def maiorQue(x: Int)(y: Int) = {
(x, y) match {
case (x, y) => if (x > y) true else false
case _ => false
}
}
Pattern Matching
● Verifica um dado padrão em um conjunto de dados
def somaLista(l: List[Int], soma: Int = 0): Int = l match {
case Nil => soma
case head::tail => somaLista(tail, head + soma)
}
Pattern Matching
● Verifica um dado padrão em um conjunto de dados
def aplicaLista(f: Int => Int, l: List[Int]): List[Int] = l match {
case Nil => Nil
case h::t => f(h)::aplicaLista(f, t)
}
Pattern Matching
● Verifica um dado padrão em um conjunto de dados
def map2[A, B]( l: List[A])(f: (A) => B): List[B] = l match {
case Nil => Nil
case h::t => f(h)::map2(t)(f)
}
Experimente:
map2(('a' to 'e').toList) { (x: Char) => (x + 1).toChar }
Avaliação preguiçosa
● Técnica que atrasa a computação de uma expressão enquanto o seu resultado
não for requisitado
scala> lazy val naturais = Stream.from(0)
scala> val lista10 = naturais take 11
lista10: scala.collection.immutable.Stream[Int] = Stream(0, ?)
scala> lista10.force
res15: scala.collection.immutable.Stream[Int] = Stream(0, 1, 2, 3, 4, 5, 6, 7, 8
, 9, 10)
For Comprehension
def tabuada(n: Int) = for (i <- 0 to 10) yield i*n
let tabuada n = [for i in 0 .. 10 -> i*n]
let tabuada n = [n*x | x <- [0..10]]
For Comprehension
def tabuada(n: Int) =
(for (i <- 0 to 10) yield i*n) filter { (x) => x%2==0 }
let tabuada n =
[for i in 0 .. 10 do if (i*n)%2 = 0 then yield i*n]
let tabuada n = filter (x -> mod x 2 == 0) [n*x | x <- [0..10]]
Vamos atuar!
Quer aprender mais?
● Coursera
● Livros
● Youtube
● Documentação
Nem tudo é perfeito
● A linguagem ainda é recente
● Muitas maneiras de realizar uma mesma computação
● Compilador ainda é lento e gera muito “lixo”
● SBT (Scala Build Tool) ainda não tem uma versão estável
● IDE (Eclipse) com poucos recursos comparada ao IntelliJ e
Visual Studio
● A cada versão, um pacote é removido ou substituído por
outro
Para quem Scala é indicado?
● Para quem não conhece o paradigma funcional
● Para quem usa Java e quer conhecer uma nova linguagem
que roda na JVM e seja compatível com seus programas ou
seus frameworks
● Para quem precisa de uma linguagem que seja facilmente
distribuída
● Para entusiastas
Alternativas
● Haskell
● Erlang
● F#
● OCaml
● Clojure
● Swift*
● D, Lisp, ML...
*https://leverich.github.io/swiftislikescala/
Opinião
● Scala é uma boa linguagem para começar a estudar o
paradigma funcional
● Scala pode te ajudar a desenvolver alguns métodos em
seu projeto usando a JVM
● O uso de Scala pode ser problematico em projetos
grandes, que envolvam muitos colaboradores
Referências
● Programming in Scala 2nd ed. - M. Odersky
● Scala Cookbook - A. Alexander
● Programming Scala - D. Wampler & A. Payne
● Princípios da Programação Funcional em Scala - M. Odersky (Coursera)
● Scala on Android - G. Couprie
● Programming F# 3.0 2nd ed. - C. Smith
● Learn You a Haskell for Great Good - M. Lipovaca
● Learn You Some Erlang for Great Good - F. Hébert
● Programação Funcional com a Linguagem Haskell - A. Du Bois
● Paradigma Funcional, Caso de estudo: Haskell - S. Costa
● Java in a Nutshell 5th ed. - D. Flanagan
Alguma Pergunta?
Gustavo Fernandes dos Santos
gfdsantos@inf.ufpel.edu.br

Mais conteúdo relacionado

Mais procurados

Mais procurados (18)

Oz
OzOz
Oz
 
Monadic Design
Monadic DesignMonadic Design
Monadic Design
 
Funções e procedimentos
Funções e procedimentosFunções e procedimentos
Funções e procedimentos
 
Java 8 - New Features
Java 8 - New FeaturesJava 8 - New Features
Java 8 - New Features
 
Programação funcional no dia a dia
Programação funcional no dia a diaProgramação funcional no dia a dia
Programação funcional no dia a dia
 
Linguagem R
Linguagem RLinguagem R
Linguagem R
 
Haskell
HaskellHaskell
Haskell
 
Haskell - Introdução
Haskell - IntroduçãoHaskell - Introdução
Haskell - Introdução
 
Linguagem R
Linguagem RLinguagem R
Linguagem R
 
Introdução à linguagem c
Introdução à linguagem cIntrodução à linguagem c
Introdução à linguagem c
 
Scala: unindo programação funcional e orientação a objetos
Scala: unindo programação funcional e orientação a objetosScala: unindo programação funcional e orientação a objetos
Scala: unindo programação funcional e orientação a objetos
 
TDC 2014 POA: Programacao funcional Por que Importa?
TDC 2014 POA: Programacao funcional Por que Importa?TDC 2014 POA: Programacao funcional Por que Importa?
TDC 2014 POA: Programacao funcional Por que Importa?
 
Lp script pug-pe
Lp script pug-peLp script pug-pe
Lp script pug-pe
 
áRvore sintatica
áRvore sintaticaáRvore sintatica
áRvore sintatica
 
Canivete shell
Canivete shellCanivete shell
Canivete shell
 
Migrando pra Scala
Migrando pra ScalaMigrando pra Scala
Migrando pra Scala
 
Python
PythonPython
Python
 
Standard ML / CPN ML
Standard ML / CPN MLStandard ML / CPN ML
Standard ML / CPN ML
 

Destaque

Paradigmas
ParadigmasParadigmas
Paradigmasmavega
 
Programação funcional com swift cocoa heads 24-03
Programação funcional com swift  cocoa heads 24-03Programação funcional com swift  cocoa heads 24-03
Programação funcional com swift cocoa heads 24-03Schwarzenegger Alves
 
Componentes passivos e eletromecânicos
Componentes passivos e eletromecânicosComponentes passivos e eletromecânicos
Componentes passivos e eletromecânicosNatanael Simões
 
4 introdução ao paradigma funcional
4 introdução ao paradigma funcional4 introdução ao paradigma funcional
4 introdução ao paradigma funcionalPéricles Miranda
 
Paradigmas de Programação
Paradigmas de ProgramaçãoParadigmas de Programação
Paradigmas de ProgramaçãoNatanael Simões
 
Algoritmos - Paradigmas de Programação
Algoritmos - Paradigmas de ProgramaçãoAlgoritmos - Paradigmas de Programação
Algoritmos - Paradigmas de ProgramaçãoElaine Cecília Gatto
 
Tipos de lenguaje de programacion
Tipos de lenguaje de programacionTipos de lenguaje de programacion
Tipos de lenguaje de programacionLy Andre
 
Paradigmas De Linguagem De Programação.
Paradigmas De Linguagem De Programação.Paradigmas De Linguagem De Programação.
Paradigmas De Linguagem De Programação.Valmon Gaudencio
 

Destaque (12)

Diapositiva
DiapositivaDiapositiva
Diapositiva
 
Paradigmas
ParadigmasParadigmas
Paradigmas
 
Paradigmas de programação
Paradigmas de programaçãoParadigmas de programação
Paradigmas de programação
 
Programação funcional com swift cocoa heads 24-03
Programação funcional com swift  cocoa heads 24-03Programação funcional com swift  cocoa heads 24-03
Programação funcional com swift cocoa heads 24-03
 
Componentes passivos e eletromecânicos
Componentes passivos e eletromecânicosComponentes passivos e eletromecânicos
Componentes passivos e eletromecânicos
 
Programación Funcional con Scheme
Programación Funcional con SchemeProgramación Funcional con Scheme
Programación Funcional con Scheme
 
4 introdução ao paradigma funcional
4 introdução ao paradigma funcional4 introdução ao paradigma funcional
4 introdução ao paradigma funcional
 
Paradigmas de Programação
Paradigmas de ProgramaçãoParadigmas de Programação
Paradigmas de Programação
 
Algoritmos - Paradigmas de Programação
Algoritmos - Paradigmas de ProgramaçãoAlgoritmos - Paradigmas de Programação
Algoritmos - Paradigmas de Programação
 
Paradigmas de programação
Paradigmas de programaçãoParadigmas de programação
Paradigmas de programação
 
Tipos de lenguaje de programacion
Tipos de lenguaje de programacionTipos de lenguaje de programacion
Tipos de lenguaje de programacion
 
Paradigmas De Linguagem De Programação.
Paradigmas De Linguagem De Programação.Paradigmas De Linguagem De Programação.
Paradigmas De Linguagem De Programação.
 

Semelhante a Introdução ao paradigma funcional com scala

Lógica de programação pascal
Lógica de programação   pascalLógica de programação   pascal
Lógica de programação pascalJocelma Rios
 
Padrões de projeto em linguagens funcionais
Padrões de projeto em linguagens funcionaisPadrões de projeto em linguagens funcionais
Padrões de projeto em linguagens funcionaisItalos Estilon
 
Técnicas de Programação Funcional
Técnicas de Programação FuncionalTécnicas de Programação Funcional
Técnicas de Programação FuncionalLambda 3
 
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
 
Programação funcional tipada: uma introdução
Programação funcional tipada: uma introduçãoProgramação funcional tipada: uma introdução
Programação funcional tipada: uma introduçãoArthur Xavier
 
O que é que o Java não tem?
O que é que o Java não tem?O que é que o Java não tem?
O que é que o Java não tem?Denis Costa
 
Desmistificando Built-in Functions, Lambda e List Comprehension...
Desmistificando Built-in Functions, Lambda e List Comprehension...Desmistificando Built-in Functions, Lambda e List Comprehension...
Desmistificando Built-in Functions, Lambda e List Comprehension...Matheus Pereira
 
F sharp e o paradigma funcional
F sharp e o paradigma funcionalF sharp e o paradigma funcional
F sharp e o paradigma funcionalEvandro Souza
 
Curso de Java: Introdução a lambda e Streams
Curso de Java: Introdução a lambda e StreamsCurso de Java: Introdução a lambda e Streams
Curso de Java: Introdução a lambda e StreamsHelder da Rocha
 
Aula - Funções (Curso de Python Básico -- FATEC SENAI MT)
Aula - Funções (Curso de Python Básico -- FATEC SENAI MT)Aula - Funções (Curso de Python Básico -- FATEC SENAI MT)
Aula - Funções (Curso de Python Básico -- FATEC SENAI MT)Filipe Chagas Ferraz
 
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
 
Python para quem sabe Python (aula 2)
Python para quem sabe Python (aula 2)Python para quem sabe Python (aula 2)
Python para quem sabe Python (aula 2)Luciano Ramalho
 
Apresentação sobre a linguagem lua
Apresentação sobre a linguagem luaApresentação sobre a linguagem lua
Apresentação sobre a linguagem luaRafael Sanches
 
Pymordida0 Semana de computação da SOCIESC - 2008/10
Pymordida0 Semana de computação da SOCIESC - 2008/10Pymordida0 Semana de computação da SOCIESC - 2008/10
Pymordida0 Semana de computação da SOCIESC - 2008/10Marco Mendes
 
Python - Programação funcional
Python - Programação funcionalPython - Programação funcional
Python - Programação funcionalfabiocerqueira
 

Semelhante a Introdução ao paradigma funcional com scala (20)

Lógica de programação pascal
Lógica de programação   pascalLógica de programação   pascal
Lógica de programação pascal
 
Padrões de projeto em linguagens funcionais
Padrões de projeto em linguagens funcionaisPadrões de projeto em linguagens funcionais
Padrões de projeto em linguagens funcionais
 
Técnicas de Programação Funcional
Técnicas de Programação FuncionalTécnicas de Programação Funcional
Técnicas de Programação Funcional
 
Palestra cbq
Palestra cbqPalestra cbq
Palestra cbq
 
Comandos e expressões
Comandos e expressõesComandos e expressões
Comandos e expressões
 
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
 
Programação funcional tipada: uma introdução
Programação funcional tipada: uma introduçãoProgramação funcional tipada: uma introdução
Programação funcional tipada: uma introdução
 
O que é que o Java não tem?
O que é que o Java não tem?O que é que o Java não tem?
O que é que o Java não tem?
 
Desmistificando Built-in Functions, Lambda e List Comprehension...
Desmistificando Built-in Functions, Lambda e List Comprehension...Desmistificando Built-in Functions, Lambda e List Comprehension...
Desmistificando Built-in Functions, Lambda e List Comprehension...
 
Ed1
Ed1Ed1
Ed1
 
F sharp e o paradigma funcional
F sharp e o paradigma funcionalF sharp e o paradigma funcional
F sharp e o paradigma funcional
 
Intro funcoes(2)
Intro funcoes(2)Intro funcoes(2)
Intro funcoes(2)
 
Curso de Java: Introdução a lambda e Streams
Curso de Java: Introdução a lambda e StreamsCurso de Java: Introdução a lambda e Streams
Curso de Java: Introdução a lambda e Streams
 
Aula - Funções (Curso de Python Básico -- FATEC SENAI MT)
Aula - Funções (Curso de Python Básico -- FATEC SENAI MT)Aula - Funções (Curso de Python Básico -- FATEC SENAI MT)
Aula - Funções (Curso de Python Básico -- FATEC SENAI MT)
 
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?
 
Python para quem sabe Python (aula 2)
Python para quem sabe Python (aula 2)Python para quem sabe Python (aula 2)
Python para quem sabe Python (aula 2)
 
Apresentação sobre a linguagem lua
Apresentação sobre a linguagem luaApresentação sobre a linguagem lua
Apresentação sobre a linguagem lua
 
Canivete shell
Canivete shellCanivete shell
Canivete shell
 
Pymordida0 Semana de computação da SOCIESC - 2008/10
Pymordida0 Semana de computação da SOCIESC - 2008/10Pymordida0 Semana de computação da SOCIESC - 2008/10
Pymordida0 Semana de computação da SOCIESC - 2008/10
 
Python - Programação funcional
Python - Programação funcionalPython - Programação funcional
Python - Programação funcional
 

Introdução ao paradigma funcional com scala

  • 1. Introdução ao Paradigma Funcional com Scala Gustavo Fernandes dos Santos gfdsantos@inf.ufpel.edu.br
  • 2. Paradigma Funcional ● É um paradigma de programação que trata a computação como avaliações de expressões onde é evitado a mudança de estados durante a execução do programa e utiliza dados imutáveis.
  • 3. Paradigma Funcional? Imperativo Declarativo Procedural Orientado a Objetos Funcional Lógico C, Pascal... C++, Java, Python... Haskell, Lisp... Prolog, Datalog....
  • 4. Linguagens funcionais ● Linguagens puras (Não possuem o conceito de memória) ○ Haskell ○ Miranda ● Linguagens impuras (Possuem o conceito de memória) ○ Scala ○ Erlang ○ F# ○ OCaml ○ JavaScript
  • 5. Características ● Funções de Primeira Classe e de Alta Ordem ○ Primeira Classe: permite a atribuição de funções a valores ou armazenamento em estruturas de dados ○ Alta Ordem: permite receber e retornar uma função de outra função ● Funções puras ● Recursão ● Avaliação rigorosa e preguiçosa: Forma com que os argumentos são avaliados numa expressão. ○ Rigorosa: Todos argumentos são processados no momento da avaliação ○ Preguiçosa: Os argumentos não são processados durante a sua avaliação ● Sistema de tipos
  • 6. Por que Funcional? “Because the life is too short for imperative programming” John Hughes
  • 7. Mãos na massa def qs(l: List[Int]): List[Int] = l match { case Nil => Nil case h::t => qs(t filter {_ < h}) ::: h :: qs(t filter {_ >= h}) }
  • 8. Mãos na massa def t(n:Int) = (0 to 10) map { _*n } filter { _<50 }
  • 9. Mãos na massa def t(n:Int) = (0 to 10) map { _*n } filter { _<50 } Sentido da computação
  • 10. Exemplo 1 int *t(int n) { int vet[11]; for (i = 0; i <= 10; i++) { vet[i] = i*n; } return *vet; }
  • 11. Exemplo 1 def t(n: Int) = (0 to 10) map { (x) => x * n } let t n = [0 .. 10] |> List.map (fun x => x * n) t n = map (x -> x * n) [0 .. 10]
  • 12. Por que Funcional? def t(n: Int) = (0 to 10) map { (x) => x * n } int *t(int n) { int vet[11]; for (i = 0; i <= 10; i++) { vet[i] = i*n; } return *vet; }
  • 13. Por que Funcional? E se eu quiser retornar somente os números pares da tabuada de qualquer número? Ou um intervalo? Ou os valores maiores que um certo valor?
  • 14. Exemplo 2 int *tabuada(int n) { int vet[11]; for (i = 0; i <= 10; i++) { if ( (i*n)%2 == 0 ) vet[i] = i*n; } return *vet; }
  • 15. Exemplo 2 def tabuada(n: Int) = (0 to 10) map {_*n} filter {_%2 == 0} let tabuada n = [0..10] |> List.map(fun x -> x * n) |> List.filter (fun x -> x % 2 = 0) tabuada n = filter (p -> mod p 2 == 0) (map (x -> x * n) [0.. 10])
  • 16. Por que Funcional? ● Sem: ○ Variáveis ○ Estruturas de repetição ○ Ponteiros ○ Mutabilidade ● Com: ○ Funções de alta ordem ○ Recursão ○ Avaliação preguiçosa
  • 17. Por que Funcional? ● SEM VARIÁVEIS? ● SEM ESTRUTURAS DE REPETIÇÃO?
  • 18. Funcional + OO? É possível?
  • 20. Scala Scalable Language Martin Odersky Escola Politécnica Federal de Lausanne (EPFL) www.scala-lang.org
  • 25. Java!
  • 26. Java! import java.util.Scanner object Programa { def main(args: Array[String]) { val scn = new Scanner(System.in) val linha = scn.nextLine println(linha) } }
  • 30. Começando def soma1(x: Int, y: Int) = x + y def soma2(x: Int)(y: Int) = x + y (0 to 5) map { soma2(1) } (‘a’ to ‘g’) filter { c => c != ‘e’ } (0 to 5) reduce { soma1 }
  • 31. Começando 1 + 2 = (1).+(2)
  • 32. Características do Scala ● Scala REPL (Read Evaluate Print Loop) ● Otimização de chamadas recursivas em cauda ● Funções de alta ordem e de primeira classe ● Açucares sintáticos (Syntax Sugar) ● Casamento de Padrões (Pattern Matching) ● Interoperabilidade ● Suporte completo ao paradigma funcional ● Suporte completo ao paradigma orientado a objetos ● Linguagem hibrida (Multiparadigma) ● ...
  • 34. Otimização de chamadas recursivas em cauda ● Somente funções “recursivas em cauda” podem ser otimizadas ● Usa-se a anotação tailrec ● Evita o “Stackoverflow”
  • 35. Otimização de chamadas recursivas em cauda ● Somente funções “recursivas em cauda” podem ser otimizadas ● Usa-se a anotação tailrec ● Evita o “Stackoverflow” ● O Fatorial
  • 36. Otimização de chamadas recursivas em cauda ● Somente funções “recursivas em cauda” podem ser otimizadas ● Usa-se a anotação tailrec ● Evita o “Stackoverflow” ● O Fatorial def fatorial(n: Int): Int = if (n == 1) 1 else n*fatorial(n-1)
  • 37. Otimização de chamadas recursivas em cauda ● Somente funções “recursivas em cauda” podem ser otimizadas ● Usa-se a anotação tailrec ● Evita o “Stackoverflow” ● O Fatorial def fatorial(n: Int): Int = if (n == 1) 1 else n*fatorial(n-1) @annotation.tailrec def fat(n: Int, acum: Int = 1): Int = if (n == 1) acum else fat(n-1, n*acum)
  • 38. Funções de alta ordem ● Linguagens de programação com suporte a funções de alta ordem, encaram uma função da mesma forma como uma linguagem imperativa, como C++, encara uma variável. ● Funções podem ser passadas como argumentos para outras funções ● Funções podem ser retornadas de outras funções ● Funções podem ser compostas ● Funções podem ser atribuídas ● ...
  • 39. Funções de alta ordem ● Um exemplo de funções de alta ordem pode ser visto no Cálculo, onde o operador d/dx retorna a derivada de uma função f. d/dx(x²) = 2x
  • 40. Funções de alta ordem C++ … function<int, int> soma = [](x, y) { return (x + y); }; … Scala val soma = (x: Int, y: Int) => x + y
  • 41. Funções de alta ordem val f = (x: Int) => 2 * x def g(f: Int => Int, x: Int) = f(x) println(g(f, 3))
  • 42. Funções de alta ordem val f = (x: Int) => 2 * x def m[A,B](f: (A) => B, l: List[A]): List[B] = l match { case Nil => Nil case h::t => f(h)::m(f, t) }
  • 43. Pattern Matching (Switch com super poderes) ● Verifica um dado padrão em um conjunto de dados def maiorque(x: Int, y: Int) = { (x, y) match { case (x, y) if x > y => true case (x, y) if x < y => false case _ => false } }
  • 44. Pattern Matching ● Verifica um dado padrão em um conjunto de dados def maiorQue(x: Int)(y: Int) = { (x, y) match { case (x, y) => if (x > y) true else false case _ => false } }
  • 45. Pattern Matching ● Verifica um dado padrão em um conjunto de dados def somaLista(l: List[Int], soma: Int = 0): Int = l match { case Nil => soma case head::tail => somaLista(tail, head + soma) }
  • 46. Pattern Matching ● Verifica um dado padrão em um conjunto de dados def aplicaLista(f: Int => Int, l: List[Int]): List[Int] = l match { case Nil => Nil case h::t => f(h)::aplicaLista(f, t) }
  • 47. Pattern Matching ● Verifica um dado padrão em um conjunto de dados def map2[A, B]( l: List[A])(f: (A) => B): List[B] = l match { case Nil => Nil case h::t => f(h)::map2(t)(f) } Experimente: map2(('a' to 'e').toList) { (x: Char) => (x + 1).toChar }
  • 48. Avaliação preguiçosa ● Técnica que atrasa a computação de uma expressão enquanto o seu resultado não for requisitado scala> lazy val naturais = Stream.from(0) scala> val lista10 = naturais take 11 lista10: scala.collection.immutable.Stream[Int] = Stream(0, ?) scala> lista10.force res15: scala.collection.immutable.Stream[Int] = Stream(0, 1, 2, 3, 4, 5, 6, 7, 8 , 9, 10)
  • 49. For Comprehension def tabuada(n: Int) = for (i <- 0 to 10) yield i*n let tabuada n = [for i in 0 .. 10 -> i*n] let tabuada n = [n*x | x <- [0..10]]
  • 50. For Comprehension def tabuada(n: Int) = (for (i <- 0 to 10) yield i*n) filter { (x) => x%2==0 } let tabuada n = [for i in 0 .. 10 do if (i*n)%2 = 0 then yield i*n] let tabuada n = filter (x -> mod x 2 == 0) [n*x | x <- [0..10]]
  • 52. Quer aprender mais? ● Coursera ● Livros ● Youtube ● Documentação
  • 53. Nem tudo é perfeito ● A linguagem ainda é recente ● Muitas maneiras de realizar uma mesma computação ● Compilador ainda é lento e gera muito “lixo” ● SBT (Scala Build Tool) ainda não tem uma versão estável ● IDE (Eclipse) com poucos recursos comparada ao IntelliJ e Visual Studio ● A cada versão, um pacote é removido ou substituído por outro
  • 54. Para quem Scala é indicado? ● Para quem não conhece o paradigma funcional ● Para quem usa Java e quer conhecer uma nova linguagem que roda na JVM e seja compatível com seus programas ou seus frameworks ● Para quem precisa de uma linguagem que seja facilmente distribuída ● Para entusiastas
  • 55. Alternativas ● Haskell ● Erlang ● F# ● OCaml ● Clojure ● Swift* ● D, Lisp, ML... *https://leverich.github.io/swiftislikescala/
  • 56. Opinião ● Scala é uma boa linguagem para começar a estudar o paradigma funcional ● Scala pode te ajudar a desenvolver alguns métodos em seu projeto usando a JVM ● O uso de Scala pode ser problematico em projetos grandes, que envolvam muitos colaboradores
  • 57. Referências ● Programming in Scala 2nd ed. - M. Odersky ● Scala Cookbook - A. Alexander ● Programming Scala - D. Wampler & A. Payne ● Princípios da Programação Funcional em Scala - M. Odersky (Coursera) ● Scala on Android - G. Couprie ● Programming F# 3.0 2nd ed. - C. Smith ● Learn You a Haskell for Great Good - M. Lipovaca ● Learn You Some Erlang for Great Good - F. Hébert ● Programação Funcional com a Linguagem Haskell - A. Du Bois ● Paradigma Funcional, Caso de estudo: Haskell - S. Costa ● Java in a Nutshell 5th ed. - D. Flanagan
  • 58. Alguma Pergunta? Gustavo Fernandes dos Santos gfdsantos@inf.ufpel.edu.br