Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Por que dizemos que Scala é uma linguagem funcional?

Por que dizemos que Scala é uma linguagem funcional?

Presented at: VII Scaladores, June/2012.

Pedro Matiello

June 13, 2012
Tweet

More Decks by Pedro Matiello

Other Decks in Programming

Transcript

  1. •Um programa é uma função •Normalmente composta de outras funções

    •A entrada são os argumentos •A saída é o valor devolvido
  2.          

      f(x) = x²
  3. •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
  4. 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)
  5. 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)
  6. 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)
  7. •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)
  8. def loop(condition: => Boolean)(expression: => Unit) { if (condition) {

    expression loop(condition)(expression) } } CALL BY NAME
  9. def loop(condition: => Boolean)(expression: => Unit) { if (condition) {

    expression loop(condition)(expression) } } CALL BY NAME
  10. 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
  11. 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
  12. 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 (apenas non-strict evaluation)
  13. 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
  14. 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
  15. 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
  16. 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
  17. 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
  18. 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 LAZY VALS
  19. 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
  20. 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
  21. 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) STREAMS