SlideShare ist ein Scribd-Unternehmen logo
1 von 35
Downloaden Sie, um offline zu lesen
POR QUE DIZEMOS QUE
SCALA É UMA LINGUAGEM
     FUNCIONAL?
POR QUE DIZEMOS QUE
SCALA É UMA LINGUAGEM
     FUNCIONAL?
        Pedro Matiello
      pmatiello@gmail.com
          @pmatiello
SCALA
• Tipagem   estática

• Programação   orientada a objetos

• Programação   funcional
PROGRAMAÇÃO FUNCIONAL
• Hughes, John.: Why
                Functional
 Programming Matters. The Computer
 Journal (1984)
•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)
FUNÇÕES DE ORDEM
    SUPERIOR
• Umafunção de ordem superior satisfaz ao menos
 uma das propriedades abaixo:

 • Aceita   ao menos uma função como argumento

 • Devolve   uma função
scala> def square(i:Int) = i*i
square: (i: Int)Int

scala> val list = (1 to 10).toList
list: List[Int] = List(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
scala> def square(i:Int) = i*i
square: (i: Int)Int

scala> val list = (1 to 10).toList
list: List[Int] = List(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)

scala> list.map(square)
res0: List[Int] = List(1, 4, 9, 16, 25, 36, 49, 64, 81,
100)
scala> def square(i:Int) = i*i
square: (i: Int)Int

scala> val list = (1 to 10).toList
list: List[Int] = List(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)

scala> list.map(square)
res0: List[Int] = List(1, 4, 9, 16, 25, 36, 49, 64, 81,
100)
AVALIAÇÃO ATRASADA
• Estratégia
          de avaliação que satisfaz ambas as
 propriedades abaixo:

 •A  avaliação da expressão é atrasada até que o
   valor seja necessário (non-strict evaluation)

 • Avaliações   repetidas são evitadas (sharing)
CALL BY NAME
def loop(condition: => Boolean)(expression: => Unit) {
  if (condition) {
    expression
    loop(condition)(expression)
  }
}
CALL BY NAME
def loop(condition: => Boolean)(expression: => Unit) {
  if (condition) {
    expression
    loop(condition)(expression)
  }
}
CALL BY NAME
def loop(condition: => Boolean)(expression: => Unit) {
  if (condition) {
    expression
    loop(condition)(expression)
  }
}

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

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

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 eagerNaturals:List[Int] =
  0 :: eagerNaturals.map(_+1)
eagerNaturals: List[Int] = <lazy>
STREAMS
scala> lazy val eagerNaturals:List[Int] =
  0 :: eagerNaturals.map(_+1)
eagerNaturals: List[Int] = <lazy>

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

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

scala> lazyNaturals.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)
POR QUE DIZEMOS QUE SCALA É
  UMA LINGUAGEM FUNCIONAL?
                      Pedro Matiello
                pmatiello@gmail.com
                         @pmatiello

Weitere ähnliche Inhalte

Ähnlich wie Por que dizemos que Scala é uma linguagem funcional?

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
 
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
 
Estruturas de dados em Python
Estruturas de dados em PythonEstruturas de dados em Python
Estruturas de dados em PythonRicardo Paiva
 
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
 
Estruturas de Dados - Listas Encadeadas (Linked List)
Estruturas de Dados - Listas Encadeadas (Linked List)Estruturas de Dados - Listas Encadeadas (Linked List)
Estruturas de Dados - Listas Encadeadas (Linked List)Erick Petrucelli
 
Técnicas de Programação Funcional
Técnicas de Programação FuncionalTécnicas de Programação Funcional
Técnicas de Programação FuncionalLambda 3
 
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
 
Persistência de Dados no SQLite com Room
Persistência de Dados no SQLite com RoomPersistência de Dados no SQLite com Room
Persistência de Dados no SQLite com RoomNelson Glauber Leal
 
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
 
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
 

Ähnlich wie Por que dizemos que Scala é uma linguagem funcional? (20)

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
 
SPL Datastructures
SPL DatastructuresSPL Datastructures
SPL Datastructures
 
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
 
Estruturas de dados em Python
Estruturas de dados em PythonEstruturas de dados em Python
Estruturas de dados em Python
 
Linguagem R
Linguagem RLinguagem R
Linguagem R
 
Scheme
SchemeScheme
Scheme
 
iOS 8 com swift
iOS 8 com swiftiOS 8 com swift
iOS 8 com swift
 
Fundamentos de C#
Fundamentos de C#Fundamentos de C#
Fundamentos de C#
 
Python
PythonPython
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)
 
Java 8 - New Features
Java 8 - New FeaturesJava 8 - New Features
Java 8 - New Features
 
Estruturas de Dados - Listas Encadeadas (Linked List)
Estruturas de Dados - Listas Encadeadas (Linked List)Estruturas de Dados - Listas Encadeadas (Linked List)
Estruturas de Dados - Listas Encadeadas (Linked List)
 
Técnicas de Programação Funcional
Técnicas de Programação FuncionalTécnicas de Programação Funcional
Técnicas de Programação Funcional
 
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?
 
Persistência de Dados no SQLite com Room
Persistência de Dados no SQLite com RoomPersistência de Dados no SQLite com Room
Persistência de Dados no SQLite com Room
 
Turbinando o desenvolvimento Android com Kotlin
Turbinando o desenvolvimento Android com KotlinTurbinando o desenvolvimento Android com Kotlin
Turbinando o desenvolvimento Android com Kotlin
 
App scala
App scalaApp scala
App scala
 
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
 
Resolução lista2
Resolução lista2Resolução lista2
Resolução lista2
 
Canivete shell
Canivete shellCanivete shell
Canivete shell
 

Por que dizemos que Scala é uma linguagem funcional?

  • 1. POR QUE DIZEMOS QUE SCALA É UMA LINGUAGEM FUNCIONAL?
  • 2. POR QUE DIZEMOS QUE SCALA É UMA LINGUAGEM FUNCIONAL? Pedro Matiello pmatiello@gmail.com @pmatiello
  • 4. • Tipagem estática • Programação orientada a objetos • Programação funcional
  • 6. • Hughes, John.: Why Functional Programming Matters. The Computer Journal (1984)
  • 7. •A operação fundamental é a aplicação de funções
  • 8. • Um programa é uma função • Normalmente composta de outras funções •A entrada são os argumentos •A saída é o valor devolvido
  • 10. • Transparência referencial (referential transparency) •A aplicação de uma função não produz efeitos colaterais
  • 11. • Funções de ordem superior (higher-order functions) • Avaliação atrasada (lazy evaluation)
  • 12. FUNÇÕES DE ORDEM SUPERIOR
  • 13. • Umafunção de ordem superior satisfaz ao menos uma das propriedades abaixo: • Aceita ao menos uma função como argumento • Devolve uma função
  • 14. scala> def square(i:Int) = i*i square: (i: Int)Int scala> val list = (1 to 10).toList list: List[Int] = List(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
  • 15. scala> def square(i:Int) = i*i square: (i: Int)Int scala> val list = (1 to 10).toList list: List[Int] = List(1, 2, 3, 4, 5, 6, 7, 8, 9, 10) scala> list.map(square) res0: List[Int] = List(1, 4, 9, 16, 25, 36, 49, 64, 81, 100)
  • 16. scala> def square(i:Int) = i*i square: (i: Int)Int scala> val list = (1 to 10).toList list: List[Int] = List(1, 2, 3, 4, 5, 6, 7, 8, 9, 10) scala> list.map(square) res0: List[Int] = List(1, 4, 9, 16, 25, 36, 49, 64, 81, 100)
  • 18. • Estratégia de avaliação que satisfaz ambas as propriedades abaixo: •A avaliação da expressão é atrasada até que o valor seja necessário (non-strict evaluation) • Avaliações repetidas são evitadas (sharing)
  • 19. CALL BY NAME def loop(condition: => Boolean)(expression: => Unit) { if (condition) { expression loop(condition)(expression) } }
  • 20. CALL BY NAME def loop(condition: => Boolean)(expression: => Unit) { if (condition) { expression loop(condition)(expression) } }
  • 21. CALL BY NAME def loop(condition: => Boolean)(expression: => Unit) { if (condition) { expression loop(condition)(expression) } } var i = 0; loop(i < 5) { println(i); i=i+1 }
  • 22. CALL BY NAME def loop(condition: => Boolean)(expression: => Unit) { if (condition) { expression loop(condition)(expression) } } var i = 0; loop(i < 5) { println(i); i=i+1 } 0 1 2 3 4
  • 23. CALL BY NAME def loop(condition: => Boolean)(expression: => Unit) { if (condition) { expression loop(condition)(expression) } } var i = 0; loop(i < 5) { println(i); i=i+1 } 0 1 2 (apenas non-strict evaluation) 3 4
  • 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>
  • 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
  • 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
  • 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
  • 29. 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
  • 30. STREAMS scala> lazy val eagerNaturals:List[Int] = 0 :: eagerNaturals.map(_+1) eagerNaturals: List[Int] = <lazy>
  • 31. STREAMS scala> lazy val eagerNaturals:List[Int] = 0 :: eagerNaturals.map(_+1) eagerNaturals: List[Int] = <lazy> scala> eagerNaturals.take(20) java.lang.StackOverflowError ! at .eagerNaturals(<console>:7) ! at .eagerNaturals(<console>:7) ! ...
  • 32. STREAMS scala> lazy val lazyNaturals:Stream[Int] = 0 #:: lazyNaturals.map(_+1) lazyNaturals: Stream[Int] = <lazy>
  • 33. STREAMS scala> lazy val lazyNaturals:Stream[Int] = 0 #:: lazyNaturals.map(_+1) lazyNaturals: Stream[Int] = <lazy> scala> lazyNaturals.take(20) res0: scala.collection.immutable.Stream[Int] = Stream(0, ?)
  • 34. STREAMS scala> lazy val lazyNaturals:Stream[Int] = 0 #:: lazyNaturals.map(_+1) lazyNaturals: Stream[Int] = <lazy> scala> lazyNaturals.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)
  • 35. POR QUE DIZEMOS QUE SCALA É UMA LINGUAGEM FUNCIONAL? Pedro Matiello pmatiello@gmail.com @pmatiello