por que dizemos que scala é uma linguagem funcional?

35
POR QUE DIZEMOS QUE SCALA É UMA LINGUAGEM FUNCIONAL?

Upload: pmatiello

Post on 05-Jul-2015

293 views

Category:

Technology


1 download

DESCRIPTION

Presented at: VII Scaladores, June/2012.

TRANSCRIPT

Page 1: Por que dizemos que Scala é uma linguagem funcional?

POR QUE DIZEMOS QUE SCALA É UMA LINGUAGEM

FUNCIONAL?

Page 2: Por que dizemos que Scala é uma linguagem funcional?

Pedro [email protected]

@pmatiello

POR QUE DIZEMOS QUE SCALA É UMA LINGUAGEM

FUNCIONAL?

Page 3: Por que dizemos que Scala é uma linguagem funcional?

SCALA

Page 4: Por que dizemos que Scala é uma linguagem funcional?

•Tipagem estática

•Programação orientada a objetos

•Programação funcional

Page 5: Por que dizemos que Scala é uma linguagem funcional?

PROGRAMAÇÃO FUNCIONAL

Page 6: Por que dizemos que Scala é uma linguagem funcional?

•Hughes, John.: Why Functional Programming Matters. The Computer Journal (1984)

Page 7: Por que dizemos que Scala é uma linguagem funcional?

•A operação fundamental é a aplicação de funções

Page 8: Por que dizemos que Scala é uma linguagem funcional?

•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?

��

��

��

f(x) = x²

Page 10: Por que dizemos que Scala é uma linguagem funcional?

•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?

•Funções de ordem superior (higher-order functions)

•Avaliação atrasada (lazy evaluation)

Page 12: Por que dizemos que Scala é uma linguagem funcional?

FUNÇÕES DE ORDEM SUPERIOR

Page 13: Por que dizemos que Scala é uma linguagem funcional?

•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?

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?

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?

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?

AVALIAÇÃO ATRASADA

Page 18: Por que dizemos que Scala é uma linguagem funcional?

•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?

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?

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?

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?

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?

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?

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?

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?

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?

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?

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?

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?

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?

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?

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?

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?

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

Page 35: Por que dizemos que Scala é uma linguagem funcional?

POR QUE DIZEMOS QUE SCALA É UMA LINGUAGEM FUNCIONAL?

Pedro [email protected]

@pmatiello