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

Mais conteúdo relacionado

Semelhante a 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 Python
Diogo Gomes
 
SPL Datastructures
SPL DatastructuresSPL Datastructures
SPL Datastructures
Felipe Ribeiro
 
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
CRISLANIO MACEDO
 
Estruturas de dados em Python
Estruturas de dados em PythonEstruturas de dados em Python
Estruturas de dados em Python
Ricardo Paiva
 
Linguagem R
Linguagem RLinguagem R
Linguagem R
Anderson Sanches
 
Scheme
SchemeScheme
Scheme
danielppgua
 
iOS 8 com swift
iOS 8 com swiftiOS 8 com swift
Fundamentos de C#
Fundamentos de C#Fundamentos de C#
Fundamentos de C#
Ângela Vitorino
 
Python
PythonPython
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
 
Java 8 - New Features
Java 8 - New FeaturesJava 8 - New Features
Java 8 - New Features
Rafael Brito de Oliveira
 
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 Funcional
Lambda 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 Room
Nelson Glauber Leal
 
Turbinando o desenvolvimento Android com Kotlin
Turbinando o desenvolvimento Android com KotlinTurbinando o desenvolvimento Android com Kotlin
Turbinando o desenvolvimento Android com Kotlin
Nelson Glauber Leal
 
App scala
App scalaApp scala
App scala
Agnaldo Oliveira
 
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
Rodolpho Eckhardt
 
Resolução lista2
Resolução lista2Resolução lista2
Resolução lista2
CRISLANIO MACEDO
 
Canivete shell
Canivete shellCanivete shell
Canivete shell
Carlos Eduardo
 

Semelhante a 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
 

Último

TOO - TÉCNICAS DE ORIENTAÇÃO A OBJETOS aula 1.pdf
TOO - TÉCNICAS DE ORIENTAÇÃO A OBJETOS aula 1.pdfTOO - TÉCNICAS DE ORIENTAÇÃO A OBJETOS aula 1.pdf
TOO - TÉCNICAS DE ORIENTAÇÃO A OBJETOS aula 1.pdf
Momento da Informática
 
Certificado Jornada Python Da Hashtag.pdf
Certificado Jornada Python Da Hashtag.pdfCertificado Jornada Python Da Hashtag.pdf
Certificado Jornada Python Da Hashtag.pdf
joaovmp3
 
Logica de Progamacao - Aula (1) (1).pptx
Logica de Progamacao - Aula (1) (1).pptxLogica de Progamacao - Aula (1) (1).pptx
Logica de Progamacao - Aula (1) (1).pptx
Momento da Informática
 
História da Rádio- 1936-1970 século XIX .2.pptx
História da Rádio- 1936-1970 século XIX   .2.pptxHistória da Rádio- 1936-1970 século XIX   .2.pptx
História da Rádio- 1936-1970 século XIX .2.pptx
TomasSousa7
 
DESENVOLVIMENTO DE SOFTWARE I_aula1-2.pdf
DESENVOLVIMENTO DE SOFTWARE I_aula1-2.pdfDESENVOLVIMENTO DE SOFTWARE I_aula1-2.pdf
DESENVOLVIMENTO DE SOFTWARE I_aula1-2.pdf
Momento da Informática
 
Manual-de-Credenciamento ANATER 2023.pdf
Manual-de-Credenciamento ANATER 2023.pdfManual-de-Credenciamento ANATER 2023.pdf
Manual-de-Credenciamento ANATER 2023.pdf
WELITONNOGUEIRA3
 

Último (6)

TOO - TÉCNICAS DE ORIENTAÇÃO A OBJETOS aula 1.pdf
TOO - TÉCNICAS DE ORIENTAÇÃO A OBJETOS aula 1.pdfTOO - TÉCNICAS DE ORIENTAÇÃO A OBJETOS aula 1.pdf
TOO - TÉCNICAS DE ORIENTAÇÃO A OBJETOS aula 1.pdf
 
Certificado Jornada Python Da Hashtag.pdf
Certificado Jornada Python Da Hashtag.pdfCertificado Jornada Python Da Hashtag.pdf
Certificado Jornada Python Da Hashtag.pdf
 
Logica de Progamacao - Aula (1) (1).pptx
Logica de Progamacao - Aula (1) (1).pptxLogica de Progamacao - Aula (1) (1).pptx
Logica de Progamacao - Aula (1) (1).pptx
 
História da Rádio- 1936-1970 século XIX .2.pptx
História da Rádio- 1936-1970 século XIX   .2.pptxHistória da Rádio- 1936-1970 século XIX   .2.pptx
História da Rádio- 1936-1970 século XIX .2.pptx
 
DESENVOLVIMENTO DE SOFTWARE I_aula1-2.pdf
DESENVOLVIMENTO DE SOFTWARE I_aula1-2.pdfDESENVOLVIMENTO DE SOFTWARE I_aula1-2.pdf
DESENVOLVIMENTO DE SOFTWARE I_aula1-2.pdf
 
Manual-de-Credenciamento ANATER 2023.pdf
Manual-de-Credenciamento ANATER 2023.pdfManual-de-Credenciamento ANATER 2023.pdf
Manual-de-Credenciamento ANATER 2023.pdf
 

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