SlideShare uma empresa Scribd logo
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

PDF
Programação funcional
PDF
Paradigma Funcional - Caso de Estudo Haskell
PDF
Introdução Programação Funcional
PDF
SciLab -Tutorial
PPTX
Programacao funcional
PDF
Scheme
PDF
Programação funcional
PDF
Programação funcional
Paradigma Funcional - Caso de Estudo Haskell
Introdução Programação Funcional
SciLab -Tutorial
Programacao funcional
Scheme
Programação funcional

Mais procurados (18)

PDF
Oz
PPTX
Monadic Design
PDF
Funções e procedimentos
PDF
Java 8 - New Features
PPTX
Programação funcional no dia a dia
PDF
Linguagem R
PDF
Haskell
PDF
Haskell - Introdução
ODP
Linguagem R
PPTX
Introdução à linguagem c
PDF
Scala: unindo programação funcional e orientação a objetos
PDF
TDC 2014 POA: Programacao funcional Por que Importa?
PPTX
Lp script pug-pe
PDF
áRvore sintatica
PDF
Canivete shell
PDF
Migrando pra Scala
PPT
Standard ML / CPN ML
Oz
Monadic Design
Funções e procedimentos
Java 8 - New Features
Programação funcional no dia a dia
Linguagem R
Haskell
Haskell - Introdução
Linguagem R
Introdução à linguagem c
Scala: unindo programação funcional e orientação a objetos
TDC 2014 POA: Programacao funcional Por que Importa?
Lp script pug-pe
áRvore sintatica
Canivete shell
Migrando pra Scala
Standard ML / CPN ML
Anúncio

Destaque (12)

PPTX
PPT
Paradigmas
ODP
Paradigmas de programação
PDF
Programação funcional com swift cocoa heads 24-03
ODP
Componentes passivos e eletromecânicos
PDF
Programación Funcional con Scheme
PPTX
4 introdução ao paradigma funcional
PPTX
Paradigmas de Programação
PPTX
Algoritmos - Paradigmas de Programação
PDF
Paradigmas de programação
PPTX
Tipos de lenguaje de programacion
PPT
Paradigmas De Linguagem De Programação.
Paradigmas
Paradigmas de programação
Programação funcional com swift cocoa heads 24-03
Componentes passivos e eletromecânicos
Programación Funcional con Scheme
4 introdução ao paradigma funcional
Paradigmas de Programação
Algoritmos - Paradigmas de Programação
Paradigmas de programação
Tipos de lenguaje de programacion
Paradigmas De Linguagem De Programação.
Anúncio

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

PDF
Lógica de programação pascal
PDF
Padrões de projeto em linguagens funcionais
PPTX
Técnicas de Programação Funcional
ODP
Palestra cbq
PDF
Comandos e expressões
PPTX
IEEEweek 2017 @ DETI Univ. Aveiro - Workshop Python
PDF
aula algoritmos e programação LinguagemC.pdf
PDF
Programação funcional tipada: uma introdução
PDF
O que é que o Java não tem?
PDF
Desmistificando Built-in Functions, Lambda e List Comprehension...
PPTX
F sharp e o paradigma funcional
PDF
Intro funcoes(2)
PDF
Curso de Java: Introdução a lambda e Streams
PDF
Aula - Funções (Curso de Python Básico -- FATEC SENAI MT)
PDF
Por que dizemos que Scala é uma linguagem funcional?
PDF
Python para quem sabe Python (aula 2)
PPTX
Apresentação sobre a linguagem lua
PDF
Canivete shell
ODP
Pymordida0 Semana de computação da SOCIESC - 2008/10
Lógica de programação pascal
Padrões de projeto em linguagens funcionais
Técnicas de Programação Funcional
Palestra cbq
Comandos e expressões
IEEEweek 2017 @ DETI Univ. Aveiro - Workshop Python
aula algoritmos e programação LinguagemC.pdf
Programação funcional tipada: uma introdução
O que é que o Java não tem?
Desmistificando Built-in Functions, Lambda e List Comprehension...
F sharp e o paradigma funcional
Intro funcoes(2)
Curso de Java: Introdução a lambda e Streams
Aula - Funções (Curso de Python Básico -- FATEC SENAI MT)
Por que dizemos que Scala é uma linguagem funcional?
Python para quem sabe Python (aula 2)
Apresentação sobre a linguagem lua
Canivete shell
Pymordida0 Semana de computação da SOCIESC - 2008/10

Último (19)

PDF
Mergulho profundo técnico para gestão de transportes no SAP S/4HANA, S4TM6 Col14
PPTX
Programação - Linguagem C - Variáveis, Palavras Reservadas, tipos de dados, c...
PPTX
Aula 18 - Manipulacao De Arquivos python
PDF
Processos na gestão de transportes, TM100 Col18
PPTX
BANCO DE DADOS - AULAS INICIAIS-sgbd.pptx
PPTX
Como-se-implementa-um-softwareeeeeeeeeeeeeeeeeeeeeeeee.pptx
PPTX
Gestao-de-Bugs-em-Software-Introducao.pptxxxxxxxx
PDF
Gestão de transportes básica no SAP S/4HANA, S4611 Col20
PDF
Fundamentos de gerenciamento de ordens e planejamento no SAP TransportationMa...
PPTX
Informática Aplicada Informática Aplicada Plano de Ensino - estudo de caso NR...
PDF
COBITxITIL-Entenda as diferença em uso governança TI
PDF
Aula04-Academia Heri- Tecnologia Geral 2025
PDF
Fullfilment AI - Forum ecommerce 2025 // Distrito e Total Express
PPTX
Aula16ManipulaçãoDadosssssssssssssssssssssssssssss
PDF
20250805_ServiceNow e a Arquitetura Orientada a Serviços (SOA) A Base para Ap...
PDF
Apple Pippin Uma breve introdução. - David Glotz
PDF
Custos e faturamento no SAP S/4HANA Transportation Management, S4TM3 Col26
PDF
Otimizador de planejamento e execução no SAP Transportation Management, TM120...
PDF
Custos e liquidação no SAP Transportation Management, TM130 Col18
Mergulho profundo técnico para gestão de transportes no SAP S/4HANA, S4TM6 Col14
Programação - Linguagem C - Variáveis, Palavras Reservadas, tipos de dados, c...
Aula 18 - Manipulacao De Arquivos python
Processos na gestão de transportes, TM100 Col18
BANCO DE DADOS - AULAS INICIAIS-sgbd.pptx
Como-se-implementa-um-softwareeeeeeeeeeeeeeeeeeeeeeeee.pptx
Gestao-de-Bugs-em-Software-Introducao.pptxxxxxxxx
Gestão de transportes básica no SAP S/4HANA, S4611 Col20
Fundamentos de gerenciamento de ordens e planejamento no SAP TransportationMa...
Informática Aplicada Informática Aplicada Plano de Ensino - estudo de caso NR...
COBITxITIL-Entenda as diferença em uso governança TI
Aula04-Academia Heri- Tecnologia Geral 2025
Fullfilment AI - Forum ecommerce 2025 // Distrito e Total Express
Aula16ManipulaçãoDadosssssssssssssssssssssssssssss
20250805_ServiceNow e a Arquitetura Orientada a Serviços (SOA) A Base para Ap...
Apple Pippin Uma breve introdução. - David Glotz
Custos e faturamento no SAP S/4HANA Transportation Management, S4TM3 Col26
Otimizador de planejamento e execução no SAP Transportation Management, TM120...
Custos e liquidação no SAP Transportation Management, TM130 Col18

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