Por que dizemos que Scala é uma linguagem funcional?

446 views

Published on

Presented at: VII Scaladores, June/2012.

Published in: Technology
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
446
On SlideShare
0
From Embeds
0
Number of Embeds
2
Actions
Shares
0
Downloads
5
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

Por que dizemos que Scala é uma linguagem funcional?

  1. 1. POR QUE DIZEMOS QUESCALA É UMA LINGUAGEM FUNCIONAL?
  2. 2. POR QUE DIZEMOS QUESCALA É UMA LINGUAGEM FUNCIONAL? Pedro Matiello pmatiello@gmail.com @pmatiello
  3. 3. SCALA
  4. 4. • Tipagem estática• Programação orientada a objetos• Programação funcional
  5. 5. PROGRAMAÇÃO FUNCIONAL
  6. 6. • Hughes, John.: Why Functional Programming Matters. The Computer Journal (1984)
  7. 7. •A operação fundamental é a aplicação de funções
  8. 8. • Um programa é uma função • Normalmente composta de outras funções •A entrada são os argumentos •A saída é o valor devolvido
  9. 9. f(x) = x²
  10. 10. • Transparência referencial (referential transparency) •A aplicação de uma função não produz efeitos colaterais
  11. 11. • Funções de ordem superior (higher-order functions)• Avaliação atrasada (lazy evaluation)
  12. 12. FUNÇÕES DE ORDEM SUPERIOR
  13. 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. 14. scala> def square(i:Int) = i*isquare: (i: Int)Intscala> val list = (1 to 10).toListlist: List[Int] = List(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
  15. 15. scala> def square(i:Int) = i*isquare: (i: Int)Intscala> 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)
  16. 16. scala> def square(i:Int) = i*isquare: (i: Int)Intscala> 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)
  17. 17. AVALIAÇÃO ATRASADA
  18. 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. 19. CALL BY NAMEdef loop(condition: => Boolean)(expression: => Unit) { if (condition) { expression loop(condition)(expression) }}
  20. 20. CALL BY NAMEdef loop(condition: => Boolean)(expression: => Unit) { if (condition) { expression loop(condition)(expression) }}
  21. 21. CALL BY NAMEdef loop(condition: => Boolean)(expression: => Unit) { if (condition) { expression loop(condition)(expression) }}var i = 0;loop(i < 5) { println(i); i=i+1 }
  22. 22. CALL BY NAMEdef loop(condition: => Boolean)(expression: => Unit) { if (condition) { expression loop(condition)(expression) }}var i = 0;loop(i < 5) { println(i); i=i+1 }01234
  23. 23. CALL BY NAMEdef loop(condition: => Boolean)(expression: => Unit) { if (condition) { expression loop(condition)(expression) }}var i = 0;loop(i < 5) { println(i); i=i+1 }012 (apenas non-strict evaluation)34
  24. 24. LAZY VALSscala> 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. 25. LAZY VALSscala> 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. 26. LAZY VALSscala> 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. 27. LAZY VALSscala> 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
  28. 28. LAZY VALSscala> 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 = XXXscala> if (true) x else y
  29. 29. LAZY VALSscala> 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 = XXXscala> if (true) x else yres1: java.lang.String = XXX
  30. 30. STREAMSscala> lazy val eagerNaturals:List[Int] = 0 :: eagerNaturals.map(_+1)eagerNaturals: List[Int] = <lazy>
  31. 31. STREAMSscala> 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. 32. STREAMSscala> lazy val lazyNaturals:Stream[Int] = 0 #:: lazyNaturals.map(_+1)lazyNaturals: Stream[Int] = <lazy>
  33. 33. STREAMSscala> 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. 34. STREAMSscala> 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)
  35. 35. POR QUE DIZEMOS QUE SCALA É UMA LINGUAGEM FUNCIONAL? Pedro Matiello pmatiello@gmail.com @pmatiello

×