SlideShare ist ein Scribd-Unternehmen logo
1 von 66
Downloaden Sie, um offline zu lesen
LAZY EVALUATION
   EM SCALA
LAZY EVALUATION
   EM SCALA
     Pedro Matiello
   pmatiello@gmail.com
       @pmatiello
SCALA
• Tipagem   estática

• Programação   orientada a objetos

• Programação   funcional
PROGRAMAÇÃO FUNCIONAL
•A   operação fundamental é a aplicação de funções
• Um   programa é uma função

 • Normalmente     composta de outras funções

 •A    entrada são os argumentos

 •A    saída é o valor devolvido
f(x) = x²
• Transparência   referencial (referential transparency)

 •A aplicação de uma função não produz efeitos
  colaterais
• Funções   de ordem superior (higher-order functions)

• Avaliação   atrasada (lazy evaluation)
LAZY EVALUATION
•Aavaliação da expressão é atrasada até que o
valor seja necessário (non-strict evaluation)
• Avaliações   repetidas são evitadas (sharing)
SHORT-CIRCUIT EVALUATION
def condicao1 = { println("Avaliou condicao1"); true }
def condicao2 = { println("Avaliou condicao2"); false }
def condicao3 = { println("Avaliou condicao3"); true }
SHORT-CIRCUIT EVALUATION
def condicao1 = { println("Avaliou condicao1"); true }
def condicao2 = { println("Avaliou condicao2"); false }
def condicao3 = { println("Avaliou condicao3"); true }

scala> condicao1 && condicao1 && condicao2 && condicao3
SHORT-CIRCUIT EVALUATION
def condicao1 = { println("Avaliou condicao1"); true }
def condicao2 = { println("Avaliou condicao2"); false }
def condicao3 = { println("Avaliou condicao3"); true }

scala> condicao1 && condicao1 && condicao2 && condicao3
Avaliou condicao1
Avaliou condicao1
Avaliou condicao2
res0: Boolean = false
SHORT-CIRCUIT EVALUATION
def condicao1 = { println("Avaliou condicao1"); true }
def condicao2 = { println("Avaliou condicao2"); false }
def condicao3 = { println("Avaliou condicao3"); true }

scala> condicao1 && condicao1 && condicao2 && condicao3
Avaliou condicao1
Avaliou condicao1
Avaliou condicao2
res0: Boolean = false

(não é lazy evaluation)
CALL BY NAME
def loop(condicao: => Boolean)(expressao: => Unit) {
  if (condicao) {
    expressao
    loop(condicao)(expressao)
  }
}
CALL BY NAME
def loop(condicao: => Boolean)(expressao: => Unit) {
  if (condicao) {
    expressao
    loop(condicao)(expressao)
  }
}
CALL BY NAME
def loop(condicao: => Boolean)(expressao: => Unit) {
  if (condicao) {
    expressao
    loop(condicao)(expressao)
  }
}

var i = 0;
loop(i < 5) { println(i); i=i+1 }
CALL BY NAME
def loop(condicao: => Boolean)(expressao: => Unit) {
  if (condicao) {
    expressao
    loop(condicao)(expressao)
  }
}

var i = 0;
loop(i < 5) { println(i); i=i+1 }
0
1
2
3
4
CALL BY NAME
def loop(condicao: => Boolean)(expressao: => Unit) {
  if (condicao) {
    expressao
    loop(condicao)(expressao)
  }
}

var i = 0;
loop(i < 5) { println(i); i=i+1 }
0
1
2 (apenas non-strict evaluation)
3
4
LAZY VALS
scala> lazy val x = { println("avaliou x"); "XXX" }
x: java.lang.String = <lazy>

scala> lazy val y = { println("avaliou y"); "YYY" }
y: java.lang.String = <lazy>
LAZY VALS
scala> lazy val x = { println("avaliou x"); "XXX" }
x: java.lang.String = <lazy>

scala> lazy val y = { println("avaliou y"); "YYY" }
y: java.lang.String = <lazy>
LAZY VALS
scala> lazy val x = { println("avaliou x"); "XXX" }
x: java.lang.String = <lazy>

scala> lazy val y = { println("avaliou y"); "YYY" }
y: java.lang.String = <lazy>

scala> if (true) x else y
LAZY VALS
scala> lazy val x = { println("avaliou x"); "XXX" }
x: java.lang.String = <lazy>

scala> lazy val y = { println("avaliou y"); "YYY" }
y: java.lang.String = <lazy>

scala> if (true) x else y
avaliou x
res0: java.lang.String = XXX
LAZY VALS
scala> lazy val x = { println("avaliou x"); "XXX" }
x: java.lang.String = <lazy>

scala> lazy val y = { println("avaliou y"); "YYY" }
y: java.lang.String = <lazy>

scala> if (true) x else y
avaliou x
res0: java.lang.String = XXX

scala> if (true) x else y
LAZY VALS
scala> lazy val x = { println("avaliou x"); "XXX" }
x: java.lang.String = <lazy>

scala> lazy val y = { println("avaliou y"); "YYY" }
y: java.lang.String = <lazy>

scala> if (true) x else y
avaliou x
res0: java.lang.String = XXX

scala> if (true) x else y
res1: java.lang.String = XXX
STREAMS
scala> lazy val naturais:List[Int] =
  0 :: naturais.map(_+1)
naturais: List[Int] = <lazy>
STREAMS
scala> lazy val naturais:List[Int] =
  0 :: naturais.map(_+1)
naturais: List[Int] = <lazy>
STREAMS
scala> lazy val naturais:List[Int] =
  0 :: naturais.map(_+1)
naturais: List[Int] = <lazy>
STREAMS
scala> lazy val naturais:List[Int] =
  0 :: naturais.map(_+1)
naturais: List[Int] = <lazy>
STREAMS
scala> lazy val naturais:List[Int] =
  0 :: naturais.map(_+1)
naturais: List[Int] = <lazy>
STREAMS
scala> lazy val naturais:List[Int] =
  0 :: naturais.map(_+1)
naturais: List[Int] = <lazy>

scala> naturais.take(20)
STREAMS
scala> lazy val naturais:List[Int] =
  0 :: naturais.map(_+1)
naturais: List[Int] = <lazy>

scala> naturais.take(20)
java.lang.StackOverflowError
! at .naturais(<console>:7)
! at .naturais(<console>:7)
! ...
STREAMS
scala> lazy val naturais:Stream[Int] =
  0 #:: naturais.map(_+1)
naturais: Stream[Int] = <lazy>
STREAMS
scala> lazy val naturais:Stream[Int] =
  0 #:: naturais.map(_+1)
naturais: Stream[Int] = <lazy>

scala> naturais.take(20)
STREAMS
scala> lazy val naturais:Stream[Int] =
  0 #:: naturais.map(_+1)
naturais: Stream[Int] = <lazy>

scala> naturais.take(20)
res0: scala.collection.immutable.Stream[Int] =
Stream(0, ?)
STREAMS
scala> lazy val naturais:Stream[Int] =
  0 #:: naturais.map(_+1)
naturais: Stream[Int] = <lazy>

scala> naturais.take(20).toList
res1: List[Int] = List(0, 1, 2, 3, 4, 5, 6, 7, 8, 9,
10, 11, 12, 13, 14, 15, 16, 17, 18, 19)
CONTUDO, PORÉM, TODAVIA
•ALazy Evaluation e a Eager Evaluation podem
produzir resultados diferentes
EAGER

1   var y = 2
2   val x = y
3   y = 3
4   println("x = " + x)
EAGER
                             y=2
1   var y = 2
2   val x = y
3   y = 3
4   println("x = " + x)
EAGER
                             y=2, x=2
1   var y = 2
2   val x = y
3   y = 3
4   println("x = " + x)
EAGER
                             y=3, x=2
1   var y = 2
2   val x = y
3   y = 3
4   println("x = " + x)
EAGER
                             y=3, x=2
1   var y = 2
2   val x = y
3   y = 3
4   println("x = " + x)

x = 2
LAZY

1   var y = 2
2   lazy val x = y
3   y = 3
4   println("x = " + x)
LAZY
                             y=2
1   var y = 2
2   lazy val x = y
3   y = 3
4   println("x = " + x)
LAZY
                             y=2, x=y
1   var y = 2
2   lazy val x = y
3   y = 3
4   println("x = " + x)
LAZY
                             y=3, x=y
1   var y = 2
2   lazy val x = y
3   y = 3
4   println("x = " + x)
LAZY
                             y=3, x=3
1   var y = 2
2   lazy val x = y
3   y = 3
4   println("x = " + x)

x = 3
•O sharing do resultado das expressões pode elevar
o consumo de memória
SHARING
scala> lazy val naturais:Stream[Int] =
  0 #:: naturais.map(_+1)
naturais: Stream[Int] = <lazy>
SHARING
scala> lazy val naturais:Stream[Int] =
  0 #:: naturais.map(_+1)
naturais: Stream[Int] = <lazy>

scala> naturais.foreach{ x:Int => }
SHARING
scala> lazy val naturais:Stream[Int] =
  0 #:: naturais.map(_+1)
naturais: Stream[Int] = <lazy>

scala> naturais.foreach{ x:Int => }
Exception in thread "main" java.lang.OutOfMemoryError:
Java heap space
SHARING
scala> lazy val naturais:Stream[Int] =
  0 #:: naturais.map(_+1)
naturais: Stream[Int] = <lazy>

scala> naturais.foreach{ x:Int => }
Exception in thread "main" java.lang.OutOfMemoryError:
Java heap space
• Errospodem aparecer em locais diferentes do
 código
EAGER
1   val x = { throw new RuntimeException; 5 }
2   println("x + 3 =")
3   println(x+3)
EAGER
1   val x = { throw new RuntimeException; 5 }
2   println("x + 3 =")
3   println(x+3)

Exception in thread "main" java.lang.RuntimeException
! at Test$.main(Test.scala:1)
! at Test.main(Test.scala)
EAGER
1   val x = { throw new RuntimeException; 5 }
2   println("x + 3 =")
3   println(x+3)

Exception in thread "main" java.lang.RuntimeException
! at Test$.main(Test.scala:1)
! at Test.main(Test.scala)
LAZY
1   lazy val x = { throw new RuntimeException; 5 }
2   println("x + 3 =")
3   println(x+3)
LAZY
1   lazy val x = { throw new RuntimeException; 5 }
2   println("x + 3 =")
3   println(x+3)
LAZY
1    lazy val x = { throw new RuntimeException; 5 }
2    println("x + 3 =")
3    println(x+3)

x + 3 =
LAZY
1   lazy val x = { throw new RuntimeException; 5 }
2   println("x + 3 =")
3   println(x+3)

x + 3 =
Exception in thread "main" java.lang.RuntimeException
! at Test$.main(Test.scala:1)
! at Test$.main(Test.scala:3)
! at Test.main(Test.scala)
LAZY
1   lazy val x = { throw new RuntimeException; 5 }
2   println("x + 3 =")
3   println(x+3)

x + 3 =
Exception in thread "main" java.lang.RuntimeException
! at Test$.main(Test.scala:1)
! at Test$.main(Test.scala:3)
! at Test.main(Test.scala)
LAZY EVALUATION
       EM SCALA
           Pedro Matiello
     pmatiello@gmail.com
              @pmatiello

Weitere ähnliche Inhalte

Was ist angesagt?

Mat em geometria sol vol6 cap1
Mat em geometria sol vol6 cap1Mat em geometria sol vol6 cap1
Mat em geometria sol vol6 cap1trigono_metrico
 
LabMM3 - Aula teórica 10
LabMM3 - Aula teórica 10LabMM3 - Aula teórica 10
LabMM3 - Aula teórica 10Carlos Santos
 
Turbinando o desenvolvimento Android com Kotlin
Turbinando o desenvolvimento Android com KotlinTurbinando o desenvolvimento Android com Kotlin
Turbinando o desenvolvimento Android com KotlinNelson Glauber Leal
 
www.AulasDeMatematicaApoio.com.br - Matemática - Equação Exponêncial
 www.AulasDeMatematicaApoio.com.br  - Matemática - Equação Exponêncial www.AulasDeMatematicaApoio.com.br  - Matemática - Equação Exponêncial
www.AulasDeMatematicaApoio.com.br - Matemática - Equação ExponêncialBeatriz Góes
 
Java 8 - Afinal onde usamos no dia a dia? TDC 2015 - Porto Alegre
Java 8 - Afinal onde usamos no dia a dia? TDC 2015 - Porto AlegreJava 8 - Afinal onde usamos no dia a dia? TDC 2015 - Porto Alegre
Java 8 - Afinal onde usamos no dia a dia? TDC 2015 - Porto AlegreFrederico Maia Arantes
 
TDC2016SP - Trilha Programação Funcional
TDC2016SP - Trilha Programação FuncionalTDC2016SP - Trilha Programação Funcional
TDC2016SP - Trilha Programação Funcionaltdc-globalcode
 
Java Básico - Resolução
Java Básico - ResoluçãoJava Básico - Resolução
Java Básico - ResoluçãoAndré Salla
 

Was ist angesagt? (16)

SPL Datastructures
SPL DatastructuresSPL Datastructures
SPL Datastructures
 
Java script aula 04 - objeto array
Java script   aula 04 - objeto arrayJava script   aula 04 - objeto array
Java script aula 04 - objeto array
 
Capítulo 6
Capítulo 6Capítulo 6
Capítulo 6
 
PHP ao Extremo
PHP ao ExtremoPHP ao Extremo
PHP ao Extremo
 
Minicurso de jQuery
Minicurso de jQueryMinicurso de jQuery
Minicurso de jQuery
 
Mat em geometria sol vol6 cap1
Mat em geometria sol vol6 cap1Mat em geometria sol vol6 cap1
Mat em geometria sol vol6 cap1
 
LabMM3 - Aula teórica 10
LabMM3 - Aula teórica 10LabMM3 - Aula teórica 10
LabMM3 - Aula teórica 10
 
Turbinando o desenvolvimento Android com Kotlin
Turbinando o desenvolvimento Android com KotlinTurbinando o desenvolvimento Android com Kotlin
Turbinando o desenvolvimento Android com Kotlin
 
www.AulasDeMatematicaApoio.com.br - Matemática - Equação Exponêncial
 www.AulasDeMatematicaApoio.com.br  - Matemática - Equação Exponêncial www.AulasDeMatematicaApoio.com.br  - Matemática - Equação Exponêncial
www.AulasDeMatematicaApoio.com.br - Matemática - Equação Exponêncial
 
iOS 8 com swift
iOS 8 com swiftiOS 8 com swift
iOS 8 com swift
 
Cálculo de Derivadas
Cálculo de DerivadasCálculo de Derivadas
Cálculo de Derivadas
 
Meta-programacao em python
Meta-programacao em pythonMeta-programacao em python
Meta-programacao em python
 
Java 8 - Afinal onde usamos no dia a dia? TDC 2015 - Porto Alegre
Java 8 - Afinal onde usamos no dia a dia? TDC 2015 - Porto AlegreJava 8 - Afinal onde usamos no dia a dia? TDC 2015 - Porto Alegre
Java 8 - Afinal onde usamos no dia a dia? TDC 2015 - Porto Alegre
 
TDC2016SP - Trilha Programação Funcional
TDC2016SP - Trilha Programação FuncionalTDC2016SP - Trilha Programação Funcional
TDC2016SP - Trilha Programação Funcional
 
Java Básico - Resolução
Java Básico - ResoluçãoJava Básico - Resolução
Java Básico - Resolução
 
Variável aleatória1
Variável  aleatória1Variável  aleatória1
Variável aleatória1
 

Andere mochten auch

Pistache: A π-Calculus Internal Domain Specific Language for Scala
Pistache: A π-Calculus Internal Domain Specific Language for ScalaPistache: A π-Calculus Internal Domain Specific Language for Scala
Pistache: A π-Calculus Internal Domain Specific Language for Scalapmatiello
 
A Compositional Encoding for the Asynchronous Pi-Calculus into the Join-Calculus
A Compositional Encoding for the Asynchronous Pi-Calculus into the Join-CalculusA Compositional Encoding for the Asynchronous Pi-Calculus into the Join-Calculus
A Compositional Encoding for the Asynchronous Pi-Calculus into the Join-Calculussmennicke
 
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
 
Context Aware Reactive Applications
Context Aware Reactive ApplicationsContext Aware Reactive Applications
Context Aware Reactive ApplicationsClarkTony
 
Pict: A programming language based on the pi-calculus
Pict: A programming language based on the pi-calculusPict: A programming language based on the pi-calculus
Pict: A programming language based on the pi-calculusIMDS2014
 
Lightning Talk #9: How UX and Data Storytelling Can Shape Policy by Mika Aldaba
Lightning Talk #9: How UX and Data Storytelling Can Shape Policy by Mika AldabaLightning Talk #9: How UX and Data Storytelling Can Shape Policy by Mika Aldaba
Lightning Talk #9: How UX and Data Storytelling Can Shape Policy by Mika Aldabaux singapore
 
Hype vs. Reality: The AI Explainer
Hype vs. Reality: The AI ExplainerHype vs. Reality: The AI Explainer
Hype vs. Reality: The AI ExplainerLuminary Labs
 
Study: The Future of VR, AR and Self-Driving Cars
Study: The Future of VR, AR and Self-Driving CarsStudy: The Future of VR, AR and Self-Driving Cars
Study: The Future of VR, AR and Self-Driving CarsLinkedIn
 

Andere mochten auch (9)

Pistache: A π-Calculus Internal Domain Specific Language for Scala
Pistache: A π-Calculus Internal Domain Specific Language for ScalaPistache: A π-Calculus Internal Domain Specific Language for Scala
Pistache: A π-Calculus Internal Domain Specific Language for Scala
 
A Compositional Encoding for the Asynchronous Pi-Calculus into the Join-Calculus
A Compositional Encoding for the Asynchronous Pi-Calculus into the Join-CalculusA Compositional Encoding for the Asynchronous Pi-Calculus into the Join-Calculus
A Compositional Encoding for the Asynchronous Pi-Calculus into the Join-Calculus
 
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?
 
Context Aware Reactive Applications
Context Aware Reactive ApplicationsContext Aware Reactive Applications
Context Aware Reactive Applications
 
Pict: A programming language based on the pi-calculus
Pict: A programming language based on the pi-calculusPict: A programming language based on the pi-calculus
Pict: A programming language based on the pi-calculus
 
Succession “Losers”: What Happens to Executives Passed Over for the CEO Job?
Succession “Losers”: What Happens to Executives Passed Over for the CEO Job? Succession “Losers”: What Happens to Executives Passed Over for the CEO Job?
Succession “Losers”: What Happens to Executives Passed Over for the CEO Job?
 
Lightning Talk #9: How UX and Data Storytelling Can Shape Policy by Mika Aldaba
Lightning Talk #9: How UX and Data Storytelling Can Shape Policy by Mika AldabaLightning Talk #9: How UX and Data Storytelling Can Shape Policy by Mika Aldaba
Lightning Talk #9: How UX and Data Storytelling Can Shape Policy by Mika Aldaba
 
Hype vs. Reality: The AI Explainer
Hype vs. Reality: The AI ExplainerHype vs. Reality: The AI Explainer
Hype vs. Reality: The AI Explainer
 
Study: The Future of VR, AR and Self-Driving Cars
Study: The Future of VR, AR and Self-Driving CarsStudy: The Future of VR, AR and Self-Driving Cars
Study: The Future of VR, AR and Self-Driving Cars
 

Ähnlich wie Lazy Evaluation em Scala: avaliação atrasada e compartilhamento de expressões

Introdução à Linguagem de programação Python
Introdução à Linguagem de programação PythonIntrodução à Linguagem de programação Python
Introdução à Linguagem de programação Pythondmmartins
 
Orientação a objetos em Python (compacto)
Orientação a objetos em Python (compacto)Orientação a objetos em Python (compacto)
Orientação a objetos em Python (compacto)Luciano Ramalho
 
Bogosort e Técnicas Realmente Avançadas de Programação
Bogosort e Técnicas Realmente Avançadas de ProgramaçãoBogosort e Técnicas Realmente Avançadas de Programação
Bogosort e Técnicas Realmente Avançadas de ProgramaçãoRodolpho Eckhardt
 
Funçao quadratica-revisao
Funçao quadratica-revisaoFunçao quadratica-revisao
Funçao quadratica-revisaoMagda Damião
 
Funçao quadratica-revisao 2
Funçao quadratica-revisao 2Funçao quadratica-revisao 2
Funçao quadratica-revisao 2Magda Damião
 
Programação Reativa e Funcional e extensões para PHP
Programação Reativa e Funcional e extensões para PHPProgramação Reativa e Funcional e extensões para PHP
Programação Reativa e Funcional e extensões para PHPJuliana Chahoud
 
Espaço Vetorial: Teoria e Exercícios resolvidos
Espaço Vetorial: Teoria e Exercícios resolvidosEspaço Vetorial: Teoria e Exercícios resolvidos
Espaço Vetorial: Teoria e Exercícios resolvidosnumerosnamente
 
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
 
9 Explicação e Revisão Equações Incompletas do 2º Grau.pdf
9 Explicação e Revisão Equações Incompletas do 2º Grau.pdf9 Explicação e Revisão Equações Incompletas do 2º Grau.pdf
9 Explicação e Revisão Equações Incompletas do 2º Grau.pdfkarfrio
 
Técnicas de Programação Funcional
Técnicas de Programação FuncionalTécnicas de Programação Funcional
Técnicas de Programação FuncionalLambda 3
 
Haskell aula5 f.ordem-sup_modulos-cifra_cesar
Haskell aula5 f.ordem-sup_modulos-cifra_cesarHaskell aula5 f.ordem-sup_modulos-cifra_cesar
Haskell aula5 f.ordem-sup_modulos-cifra_cesarCRISLANIO MACEDO
 
Aula funcoes 1° e 2° graus
Aula   funcoes 1° e 2° grausAula   funcoes 1° e 2° graus
Aula funcoes 1° e 2° grausDaniel Muniz
 
www.AulasDeMatematicaApoio.com - Matemática - Função Afim
www.AulasDeMatematicaApoio.com  - Matemática - Função Afimwww.AulasDeMatematicaApoio.com  - Matemática - Função Afim
www.AulasDeMatematicaApoio.com - Matemática - Função AfimAulas De Matemática Apoio
 
Função do 2°grau
Função do 2°grauFunção do 2°grau
Função do 2°grauLSKY
 
Mn aula06-interpolacao
Mn aula06-interpolacaoMn aula06-interpolacao
Mn aula06-interpolacaojadsons95
 
Introdução ao Matlab
Introdução ao MatlabIntrodução ao Matlab
Introdução ao Matlabedusfernandes
 

Ähnlich wie Lazy Evaluation em Scala: avaliação atrasada e compartilhamento de expressões (20)

Python
PythonPython
Python
 
Calculo1 aula10
Calculo1 aula10Calculo1 aula10
Calculo1 aula10
 
Introdução à Linguagem de programação Python
Introdução à Linguagem de programação PythonIntrodução à Linguagem de programação Python
Introdução à Linguagem de programação Python
 
Orientação a objetos em Python (compacto)
Orientação a objetos em Python (compacto)Orientação a objetos em Python (compacto)
Orientação a objetos em Python (compacto)
 
Bogosort e Técnicas Realmente Avançadas de Programação
Bogosort e Técnicas Realmente Avançadas de ProgramaçãoBogosort e Técnicas Realmente Avançadas de Programação
Bogosort e Técnicas Realmente Avançadas de Programação
 
Funcoes Exponenciais
Funcoes ExponenciaisFuncoes Exponenciais
Funcoes Exponenciais
 
Funçao quadratica-revisao
Funçao quadratica-revisaoFunçao quadratica-revisao
Funçao quadratica-revisao
 
Funçao quadratica-revisao 2
Funçao quadratica-revisao 2Funçao quadratica-revisao 2
Funçao quadratica-revisao 2
 
Programação Reativa e Funcional e extensões para PHP
Programação Reativa e Funcional e extensões para PHPProgramação Reativa e Funcional e extensões para PHP
Programação Reativa e Funcional e extensões para PHP
 
Espaço Vetorial: Teoria e Exercícios resolvidos
Espaço Vetorial: Teoria e Exercícios resolvidosEspaço Vetorial: Teoria e Exercícios resolvidos
Espaço Vetorial: Teoria e Exercícios resolvidos
 
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?
 
9 Explicação e Revisão Equações Incompletas do 2º Grau.pdf
9 Explicação e Revisão Equações Incompletas do 2º Grau.pdf9 Explicação e Revisão Equações Incompletas do 2º Grau.pdf
9 Explicação e Revisão Equações Incompletas do 2º Grau.pdf
 
Técnicas de Programação Funcional
Técnicas de Programação FuncionalTécnicas de Programação Funcional
Técnicas de Programação Funcional
 
Haskell aula5 f.ordem-sup_modulos-cifra_cesar
Haskell aula5 f.ordem-sup_modulos-cifra_cesarHaskell aula5 f.ordem-sup_modulos-cifra_cesar
Haskell aula5 f.ordem-sup_modulos-cifra_cesar
 
JQuery
JQuery JQuery
JQuery
 
Aula funcoes 1° e 2° graus
Aula   funcoes 1° e 2° grausAula   funcoes 1° e 2° graus
Aula funcoes 1° e 2° graus
 
www.AulasDeMatematicaApoio.com - Matemática - Função Afim
www.AulasDeMatematicaApoio.com  - Matemática - Função Afimwww.AulasDeMatematicaApoio.com  - Matemática - Função Afim
www.AulasDeMatematicaApoio.com - Matemática - Função Afim
 
Função do 2°grau
Função do 2°grauFunção do 2°grau
Função do 2°grau
 
Mn aula06-interpolacao
Mn aula06-interpolacaoMn aula06-interpolacao
Mn aula06-interpolacao
 
Introdução ao Matlab
Introdução ao MatlabIntrodução ao Matlab
Introdução ao Matlab
 

Lazy Evaluation em Scala: avaliação atrasada e compartilhamento de expressões

  • 1. LAZY EVALUATION EM SCALA
  • 2. LAZY EVALUATION EM SCALA Pedro Matiello pmatiello@gmail.com @pmatiello
  • 4. • Tipagem estática • Programação orientada a objetos • Programação funcional
  • 6. •A operação fundamental é a aplicação de funções
  • 7. • Um programa é uma função • Normalmente composta de outras funções •A entrada são os argumentos •A saída é o valor devolvido
  • 9. • Transparência referencial (referential transparency) •A aplicação de uma função não produz efeitos colaterais
  • 10. • Funções de ordem superior (higher-order functions) • Avaliação atrasada (lazy evaluation)
  • 12. •Aavaliação da expressão é atrasada até que o valor seja necessário (non-strict evaluation)
  • 13. • Avaliações repetidas são evitadas (sharing)
  • 14. SHORT-CIRCUIT EVALUATION def condicao1 = { println("Avaliou condicao1"); true } def condicao2 = { println("Avaliou condicao2"); false } def condicao3 = { println("Avaliou condicao3"); true }
  • 15. SHORT-CIRCUIT EVALUATION def condicao1 = { println("Avaliou condicao1"); true } def condicao2 = { println("Avaliou condicao2"); false } def condicao3 = { println("Avaliou condicao3"); true } scala> condicao1 && condicao1 && condicao2 && condicao3
  • 16. SHORT-CIRCUIT EVALUATION def condicao1 = { println("Avaliou condicao1"); true } def condicao2 = { println("Avaliou condicao2"); false } def condicao3 = { println("Avaliou condicao3"); true } scala> condicao1 && condicao1 && condicao2 && condicao3 Avaliou condicao1 Avaliou condicao1 Avaliou condicao2 res0: Boolean = false
  • 17. SHORT-CIRCUIT EVALUATION def condicao1 = { println("Avaliou condicao1"); true } def condicao2 = { println("Avaliou condicao2"); false } def condicao3 = { println("Avaliou condicao3"); true } scala> condicao1 && condicao1 && condicao2 && condicao3 Avaliou condicao1 Avaliou condicao1 Avaliou condicao2 res0: Boolean = false (não é lazy evaluation)
  • 18. CALL BY NAME def loop(condicao: => Boolean)(expressao: => Unit) { if (condicao) { expressao loop(condicao)(expressao) } }
  • 19. CALL BY NAME def loop(condicao: => Boolean)(expressao: => Unit) { if (condicao) { expressao loop(condicao)(expressao) } }
  • 20. CALL BY NAME def loop(condicao: => Boolean)(expressao: => Unit) { if (condicao) { expressao loop(condicao)(expressao) } } var i = 0; loop(i < 5) { println(i); i=i+1 }
  • 21. CALL BY NAME def loop(condicao: => Boolean)(expressao: => Unit) { if (condicao) { expressao loop(condicao)(expressao) } } var i = 0; loop(i < 5) { println(i); i=i+1 } 0 1 2 3 4
  • 22. CALL BY NAME def loop(condicao: => Boolean)(expressao: => Unit) { if (condicao) { expressao loop(condicao)(expressao) } } var i = 0; loop(i < 5) { println(i); i=i+1 } 0 1 2 (apenas non-strict evaluation) 3 4
  • 23. LAZY VALS scala> lazy val x = { println("avaliou x"); "XXX" } x: java.lang.String = <lazy> scala> lazy val y = { println("avaliou y"); "YYY" } y: java.lang.String = <lazy>
  • 24. LAZY VALS scala> lazy val x = { println("avaliou x"); "XXX" } x: java.lang.String = <lazy> scala> lazy val y = { println("avaliou y"); "YYY" } y: java.lang.String = <lazy>
  • 25. LAZY VALS scala> lazy val x = { println("avaliou x"); "XXX" } x: java.lang.String = <lazy> scala> lazy val y = { println("avaliou y"); "YYY" } y: java.lang.String = <lazy> scala> if (true) x else y
  • 26. LAZY VALS scala> lazy val x = { println("avaliou x"); "XXX" } x: java.lang.String = <lazy> scala> lazy val y = { println("avaliou y"); "YYY" } y: java.lang.String = <lazy> scala> if (true) x else y avaliou x res0: java.lang.String = XXX
  • 27. LAZY VALS scala> lazy val x = { println("avaliou x"); "XXX" } x: java.lang.String = <lazy> scala> lazy val y = { println("avaliou y"); "YYY" } y: java.lang.String = <lazy> scala> if (true) x else y avaliou x res0: java.lang.String = XXX scala> if (true) x else y
  • 28. LAZY VALS scala> lazy val x = { println("avaliou x"); "XXX" } x: java.lang.String = <lazy> scala> lazy val y = { println("avaliou y"); "YYY" } y: java.lang.String = <lazy> scala> if (true) x else y avaliou x res0: java.lang.String = XXX scala> if (true) x else y res1: java.lang.String = XXX
  • 29. STREAMS scala> lazy val naturais:List[Int] = 0 :: naturais.map(_+1) naturais: List[Int] = <lazy>
  • 30. STREAMS scala> lazy val naturais:List[Int] = 0 :: naturais.map(_+1) naturais: List[Int] = <lazy>
  • 31. STREAMS scala> lazy val naturais:List[Int] = 0 :: naturais.map(_+1) naturais: List[Int] = <lazy>
  • 32. STREAMS scala> lazy val naturais:List[Int] = 0 :: naturais.map(_+1) naturais: List[Int] = <lazy>
  • 33. STREAMS scala> lazy val naturais:List[Int] = 0 :: naturais.map(_+1) naturais: List[Int] = <lazy>
  • 34. STREAMS scala> lazy val naturais:List[Int] = 0 :: naturais.map(_+1) naturais: List[Int] = <lazy> scala> naturais.take(20)
  • 35. STREAMS scala> lazy val naturais:List[Int] = 0 :: naturais.map(_+1) naturais: List[Int] = <lazy> scala> naturais.take(20) java.lang.StackOverflowError ! at .naturais(<console>:7) ! at .naturais(<console>:7) ! ...
  • 36. STREAMS scala> lazy val naturais:Stream[Int] = 0 #:: naturais.map(_+1) naturais: Stream[Int] = <lazy>
  • 37. STREAMS scala> lazy val naturais:Stream[Int] = 0 #:: naturais.map(_+1) naturais: Stream[Int] = <lazy> scala> naturais.take(20)
  • 38. STREAMS scala> lazy val naturais:Stream[Int] = 0 #:: naturais.map(_+1) naturais: Stream[Int] = <lazy> scala> naturais.take(20) res0: scala.collection.immutable.Stream[Int] = Stream(0, ?)
  • 39. STREAMS scala> lazy val naturais:Stream[Int] = 0 #:: naturais.map(_+1) naturais: Stream[Int] = <lazy> scala> naturais.take(20).toList res1: List[Int] = List(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19)
  • 41. •ALazy Evaluation e a Eager Evaluation podem produzir resultados diferentes
  • 42. EAGER 1 var y = 2 2 val x = y 3 y = 3 4 println("x = " + x)
  • 43. EAGER y=2 1 var y = 2 2 val x = y 3 y = 3 4 println("x = " + x)
  • 44. EAGER y=2, x=2 1 var y = 2 2 val x = y 3 y = 3 4 println("x = " + x)
  • 45. EAGER y=3, x=2 1 var y = 2 2 val x = y 3 y = 3 4 println("x = " + x)
  • 46. EAGER y=3, x=2 1 var y = 2 2 val x = y 3 y = 3 4 println("x = " + x) x = 2
  • 47. LAZY 1 var y = 2 2 lazy val x = y 3 y = 3 4 println("x = " + x)
  • 48. LAZY y=2 1 var y = 2 2 lazy val x = y 3 y = 3 4 println("x = " + x)
  • 49. LAZY y=2, x=y 1 var y = 2 2 lazy val x = y 3 y = 3 4 println("x = " + x)
  • 50. LAZY y=3, x=y 1 var y = 2 2 lazy val x = y 3 y = 3 4 println("x = " + x)
  • 51. LAZY y=3, x=3 1 var y = 2 2 lazy val x = y 3 y = 3 4 println("x = " + x) x = 3
  • 52. •O sharing do resultado das expressões pode elevar o consumo de memória
  • 53. SHARING scala> lazy val naturais:Stream[Int] = 0 #:: naturais.map(_+1) naturais: Stream[Int] = <lazy>
  • 54. SHARING scala> lazy val naturais:Stream[Int] = 0 #:: naturais.map(_+1) naturais: Stream[Int] = <lazy> scala> naturais.foreach{ x:Int => }
  • 55. SHARING scala> lazy val naturais:Stream[Int] = 0 #:: naturais.map(_+1) naturais: Stream[Int] = <lazy> scala> naturais.foreach{ x:Int => } Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
  • 56. SHARING scala> lazy val naturais:Stream[Int] = 0 #:: naturais.map(_+1) naturais: Stream[Int] = <lazy> scala> naturais.foreach{ x:Int => } Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
  • 57. • Errospodem aparecer em locais diferentes do código
  • 58. EAGER 1 val x = { throw new RuntimeException; 5 } 2 println("x + 3 =") 3 println(x+3)
  • 59. EAGER 1 val x = { throw new RuntimeException; 5 } 2 println("x + 3 =") 3 println(x+3) Exception in thread "main" java.lang.RuntimeException ! at Test$.main(Test.scala:1) ! at Test.main(Test.scala)
  • 60. EAGER 1 val x = { throw new RuntimeException; 5 } 2 println("x + 3 =") 3 println(x+3) Exception in thread "main" java.lang.RuntimeException ! at Test$.main(Test.scala:1) ! at Test.main(Test.scala)
  • 61. LAZY 1 lazy val x = { throw new RuntimeException; 5 } 2 println("x + 3 =") 3 println(x+3)
  • 62. LAZY 1 lazy val x = { throw new RuntimeException; 5 } 2 println("x + 3 =") 3 println(x+3)
  • 63. LAZY 1 lazy val x = { throw new RuntimeException; 5 } 2 println("x + 3 =") 3 println(x+3) x + 3 =
  • 64. LAZY 1 lazy val x = { throw new RuntimeException; 5 } 2 println("x + 3 =") 3 println(x+3) x + 3 = Exception in thread "main" java.lang.RuntimeException ! at Test$.main(Test.scala:1) ! at Test$.main(Test.scala:3) ! at Test.main(Test.scala)
  • 65. LAZY 1 lazy val x = { throw new RuntimeException; 5 } 2 println("x + 3 =") 3 println(x+3) x + 3 = Exception in thread "main" java.lang.RuntimeException ! at Test$.main(Test.scala:1) ! at Test$.main(Test.scala:3) ! at Test.main(Test.scala)
  • 66. LAZY EVALUATION EM SCALA Pedro Matiello pmatiello@gmail.com @pmatiello