por que dizemos que scala é uma linguagem funcional?
DESCRIPTION
Presented at: VII Scaladores, June/2012.TRANSCRIPT
![Page 1: Por que dizemos que Scala é uma linguagem funcional?](https://reader030.vdocuments.site/reader030/viewer/2022020116/5598fa8f1a28ab75718b45d5/html5/thumbnails/1.jpg)
POR QUE DIZEMOS QUE SCALA É UMA LINGUAGEM
FUNCIONAL?
![Page 3: Por que dizemos que Scala é uma linguagem funcional?](https://reader030.vdocuments.site/reader030/viewer/2022020116/5598fa8f1a28ab75718b45d5/html5/thumbnails/3.jpg)
SCALA
![Page 4: Por que dizemos que Scala é uma linguagem funcional?](https://reader030.vdocuments.site/reader030/viewer/2022020116/5598fa8f1a28ab75718b45d5/html5/thumbnails/4.jpg)
•Tipagem estática
•Programação orientada a objetos
•Programação funcional
![Page 5: Por que dizemos que Scala é uma linguagem funcional?](https://reader030.vdocuments.site/reader030/viewer/2022020116/5598fa8f1a28ab75718b45d5/html5/thumbnails/5.jpg)
PROGRAMAÇÃO FUNCIONAL
![Page 6: Por que dizemos que Scala é uma linguagem funcional?](https://reader030.vdocuments.site/reader030/viewer/2022020116/5598fa8f1a28ab75718b45d5/html5/thumbnails/6.jpg)
•Hughes, John.: Why Functional Programming Matters. The Computer Journal (1984)
![Page 7: Por que dizemos que Scala é uma linguagem funcional?](https://reader030.vdocuments.site/reader030/viewer/2022020116/5598fa8f1a28ab75718b45d5/html5/thumbnails/7.jpg)
•A operação fundamental é a aplicação de funções
![Page 8: Por que dizemos que Scala é uma linguagem funcional?](https://reader030.vdocuments.site/reader030/viewer/2022020116/5598fa8f1a28ab75718b45d5/html5/thumbnails/8.jpg)
•Um programa é uma função
•Normalmente composta de outras funções
•A entrada são os argumentos
•A saída é o valor devolvido
![Page 9: Por que dizemos que Scala é uma linguagem funcional?](https://reader030.vdocuments.site/reader030/viewer/2022020116/5598fa8f1a28ab75718b45d5/html5/thumbnails/9.jpg)
�
�
�
�
�
�
�
�
�
��
��
��
f(x) = x²
![Page 10: Por que dizemos que Scala é uma linguagem funcional?](https://reader030.vdocuments.site/reader030/viewer/2022020116/5598fa8f1a28ab75718b45d5/html5/thumbnails/10.jpg)
•Transparência referencial (referential transparency)
•A aplicação de uma função não produz efeitos colaterais
![Page 11: Por que dizemos que Scala é uma linguagem funcional?](https://reader030.vdocuments.site/reader030/viewer/2022020116/5598fa8f1a28ab75718b45d5/html5/thumbnails/11.jpg)
•Funções de ordem superior (higher-order functions)
•Avaliação atrasada (lazy evaluation)
![Page 12: Por que dizemos que Scala é uma linguagem funcional?](https://reader030.vdocuments.site/reader030/viewer/2022020116/5598fa8f1a28ab75718b45d5/html5/thumbnails/12.jpg)
FUNÇÕES DE ORDEM SUPERIOR
![Page 13: Por que dizemos que Scala é uma linguagem funcional?](https://reader030.vdocuments.site/reader030/viewer/2022020116/5598fa8f1a28ab75718b45d5/html5/thumbnails/13.jpg)
•Uma função de ordem superior satisfaz ao menos uma das propriedades abaixo:
•Aceita ao menos uma função como argumento
•Devolve uma função
![Page 14: Por que dizemos que Scala é uma linguagem funcional?](https://reader030.vdocuments.site/reader030/viewer/2022020116/5598fa8f1a28ab75718b45d5/html5/thumbnails/14.jpg)
scala> def square(i:Int) = i*isquare: (i: Int)Int
scala> val list = (1 to 10).toListlist: List[Int] = List(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
![Page 15: Por que dizemos que Scala é uma linguagem funcional?](https://reader030.vdocuments.site/reader030/viewer/2022020116/5598fa8f1a28ab75718b45d5/html5/thumbnails/15.jpg)
scala> def square(i:Int) = i*isquare: (i: Int)Int
scala> val list = (1 to 10).toListlist: 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)
![Page 16: Por que dizemos que Scala é uma linguagem funcional?](https://reader030.vdocuments.site/reader030/viewer/2022020116/5598fa8f1a28ab75718b45d5/html5/thumbnails/16.jpg)
scala> def square(i:Int) = i*isquare: (i: Int)Int
scala> val list = (1 to 10).toListlist: 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)
![Page 17: Por que dizemos que Scala é uma linguagem funcional?](https://reader030.vdocuments.site/reader030/viewer/2022020116/5598fa8f1a28ab75718b45d5/html5/thumbnails/17.jpg)
AVALIAÇÃO ATRASADA
![Page 18: Por que dizemos que Scala é uma linguagem funcional?](https://reader030.vdocuments.site/reader030/viewer/2022020116/5598fa8f1a28ab75718b45d5/html5/thumbnails/18.jpg)
•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)
![Page 19: Por que dizemos que Scala é uma linguagem funcional?](https://reader030.vdocuments.site/reader030/viewer/2022020116/5598fa8f1a28ab75718b45d5/html5/thumbnails/19.jpg)
def loop(condition: => Boolean)(expression: => Unit) { if (condition) { expression loop(condition)(expression) }}
CALL BY NAME
![Page 20: Por que dizemos que Scala é uma linguagem funcional?](https://reader030.vdocuments.site/reader030/viewer/2022020116/5598fa8f1a28ab75718b45d5/html5/thumbnails/20.jpg)
def loop(condition: => Boolean)(expression: => Unit) { if (condition) { expression loop(condition)(expression) }}
CALL BY NAME
![Page 21: Por que dizemos que Scala é uma linguagem funcional?](https://reader030.vdocuments.site/reader030/viewer/2022020116/5598fa8f1a28ab75718b45d5/html5/thumbnails/21.jpg)
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
![Page 22: Por que dizemos que Scala é uma linguagem funcional?](https://reader030.vdocuments.site/reader030/viewer/2022020116/5598fa8f1a28ab75718b45d5/html5/thumbnails/22.jpg)
def loop(condition: => Boolean)(expression: => Unit) { if (condition) { expression loop(condition)(expression) }}
var i = 0;loop(i < 5) { println(i); i=i+1 }01234
CALL BY NAME
![Page 23: Por que dizemos que Scala é uma linguagem funcional?](https://reader030.vdocuments.site/reader030/viewer/2022020116/5598fa8f1a28ab75718b45d5/html5/thumbnails/23.jpg)
def loop(condition: => Boolean)(expression: => Unit) { if (condition) { expression loop(condition)(expression) }}
var i = 0;loop(i < 5) { println(i); i=i+1 }01234
CALL BY NAME
(apenas non-strict evaluation)
![Page 24: Por que dizemos que Scala é uma linguagem funcional?](https://reader030.vdocuments.site/reader030/viewer/2022020116/5598fa8f1a28ab75718b45d5/html5/thumbnails/24.jpg)
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
![Page 25: Por que dizemos que Scala é uma linguagem funcional?](https://reader030.vdocuments.site/reader030/viewer/2022020116/5598fa8f1a28ab75718b45d5/html5/thumbnails/25.jpg)
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
![Page 26: Por que dizemos que Scala é uma linguagem funcional?](https://reader030.vdocuments.site/reader030/viewer/2022020116/5598fa8f1a28ab75718b45d5/html5/thumbnails/26.jpg)
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
![Page 27: Por que dizemos que Scala é uma linguagem funcional?](https://reader030.vdocuments.site/reader030/viewer/2022020116/5598fa8f1a28ab75718b45d5/html5/thumbnails/27.jpg)
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 yavaliou xres0: java.lang.String = XXX
LAZY VALS
![Page 28: Por que dizemos que Scala é uma linguagem funcional?](https://reader030.vdocuments.site/reader030/viewer/2022020116/5598fa8f1a28ab75718b45d5/html5/thumbnails/28.jpg)
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 yavaliou xres0: java.lang.String = XXX
scala> if (true) x else y
LAZY VALS
![Page 29: Por que dizemos que Scala é uma linguagem funcional?](https://reader030.vdocuments.site/reader030/viewer/2022020116/5598fa8f1a28ab75718b45d5/html5/thumbnails/29.jpg)
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 yavaliou xres0: java.lang.String = XXX
scala> if (true) x else yres1: java.lang.String = XXX
LAZY VALS
![Page 30: Por que dizemos que Scala é uma linguagem funcional?](https://reader030.vdocuments.site/reader030/viewer/2022020116/5598fa8f1a28ab75718b45d5/html5/thumbnails/30.jpg)
scala> lazy val eagerNaturals:List[Int] =0 :: eagerNaturals.map(_+1)
eagerNaturals: List[Int] = <lazy>
STREAMS
![Page 31: Por que dizemos que Scala é uma linguagem funcional?](https://reader030.vdocuments.site/reader030/viewer/2022020116/5598fa8f1a28ab75718b45d5/html5/thumbnails/31.jpg)
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
![Page 32: Por que dizemos que Scala é uma linguagem funcional?](https://reader030.vdocuments.site/reader030/viewer/2022020116/5598fa8f1a28ab75718b45d5/html5/thumbnails/32.jpg)
scala> lazy val lazyNaturals:Stream[Int] =0 #:: lazyNaturals.map(_+1)
lazyNaturals: Stream[Int] = <lazy>
STREAMS
![Page 33: Por que dizemos que Scala é uma linguagem funcional?](https://reader030.vdocuments.site/reader030/viewer/2022020116/5598fa8f1a28ab75718b45d5/html5/thumbnails/33.jpg)
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
![Page 34: Por que dizemos que Scala é uma linguagem funcional?](https://reader030.vdocuments.site/reader030/viewer/2022020116/5598fa8f1a28ab75718b45d5/html5/thumbnails/34.jpg)
scala> lazy val lazyNaturals:Stream[Int] =0 #:: lazyNaturals.map(_+1)
lazyNaturals: Stream[Int] = <lazy>
scala> lazyNaturals.take(20).toListres1: List[Int] = List(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19)
STREAMS